Rails Newbie:控制器中错误处理的建议

And*_*kin 5 ruby error-handling ruby-on-rails design-guidelines ruby-on-rails-3

对不起,如果问题很明显,我只是开始使用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
Run Code Online (Sandbox Code Playgroud)

所以问题是,在所有方法中对错误做同样事情的最佳方法是什么?
是否建议我使用save!并处理它rescue_action

或者我应该采用自己的respond方法并传递save一个块?

tad*_*man 16

在块中稍后使用保存和救援的异常提升变体通常比这样分支更方便.例外的好处是它们会破坏交易.

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
Run Code Online (Sandbox Code Playgroud)

if当你试图一次保存多个对象时,你会发现从一堆嵌套语句中解决问题变得非常棘手,但是一个简单rescue的异常将会巧妙地处理它.

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

  # ...
rescue ActiveRecord::RecordInvalid
  # ...
end
Run Code Online (Sandbox Code Playgroud)

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