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

多くの場合、そのように分岐するよりも、ブロックの後半で保存とレスキューの例外を発生させるバリアントを使用する方が便利です。例外の利点は、トランザクションが無効になることです。

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一度に複数のオブジェクトを保存しようとすると、ネストされたステートメントの山から抜け出すのが非常に難しいことがわかりますが、シンプルなrescuefor 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 に答える