5

抱歉,如果问题很明显,我才刚刚开始使用 Rails。
我现在在几个控制器方法中有以下代码:

respond_to do |format|
    if @project.save
        format.html { redirect_to(edit_project_url(@project), :notice => '#{user.name} added to #{role}.') }
        format.js
    else
        format.html { render :action => "edit" }
        format.js #...
    end
end

所以问题是,对所有方法中的错误执行相同操作的最佳方法是什么?
是否建议我使用save!和处理它rescue_action

还是我应该做自己的respond方法并传入save一个块?

4

2 回答 2

16

在块的后面使用引发异常的 save 和 rescue 变体通常比像那样分支更方便。例外的好处是它们会退出交易。

def create
  @project.save!

  respond_to do |format|
    format.html { redirect_to(edit_project_url(@project), :notice => '#{user.name} added to #{role}.') }
    format.js
  end

rescue ActiveRecord::RecordInvalid
  respond_to do |format|
    format.html { render :action => "edit" }
    format.js #...
  end
end

if您会发现,在尝试一次保存多个对象时,从一堆嵌套语句中解脱出来真的很棘手,但是一个简单rescue的 for exceptions 可以巧妙地处理它。

def create
  Project.transaction do
    @project.save!
    @something_else.save!
    @other_stuff.save!
  end

  # ...
rescue ActiveRecord::RecordInvalid
  # ...
end

如果其中任何一个保存失败,您将获得例外。为确保所有这些都显示验证错误,您可能必须调用.valid?每个来启动它们,否则您将在失败后未测试这些错误。

于 2010-10-27T15:22:10.807 回答
3

使用模式并不是一件坏事if @object.save。但是,如果您对控制器上的所有操作都执行完全相同的操作,则可以定义一个rescue_from操作。

就像是

class MyController < ActionController::Base
  rescue_from ActiveRecord::RecordInvalid do
    render :action => edit
  end
end
于 2010-10-27T15:44:59.720 回答