0

RecordNotFound 例外をスローして ActiveRecord を防御的に処理するためのベスト プラクティスとは何か疑問に思っています。Rails のデフォルトの動作は 404 エラーをレンダリングするようです。コンテンツの取得を扱っている場合、これはうまく機能します。直感的に理解できます。関連付けられたレコードを作成するようなことをしているときに、親モデルのレコードが存在しなくなった場合、404 をスローすることはより不可解に思えます。

代わりに、レコードがもう存在しないという不平を言う検証エラーを返したい場合はどうすればよいでしょうか? どうすればこれを行うことができますか?

4

2 に答える 2

2

Web サイトで 404 エラーが発生することは絶対にあってはなりません。すべてのエラーをキャッチして適切に処理するようにしてください。

エラーが発生している場所によって異なります。たとえば、編集アクションでコントローラーを使用している場合.exists?は、実際にエラーがスローされないように、おそらく と組み合わせてレスキューを使用できます。このようなもの:

def edit
    if Model.exists?(params[:id])
        @model = Model.find(params[:id])
    else
        flash[:error] = "Unable to find model with ID #{params[:id]}!"
        redirect_to models_path
    end
end

これにもモデル レベルの検証を追加できます。グループに属している (つまり、group_id を持つ) ユーザーがいるとします。この検証により、group_id が設定されているだけでなく、実際のグループ レコードにマップされていることが保証されます。

# User.rb
validates_presence_of: group

.create!そうすることで、パラメータをorメソッドに投げ込むだけ.save!では、検証は失敗し、標準の Rails エラー メッセージが表示されます。

ただし、コントローラーは例外をスローしないバージョン (.createおよび.save) を使用する必要があり、上記のようなことを行ってオブジェクトが有効かどうかを確認し、有効でない場合はフラッシュを設定します。

于 2012-05-24T15:38:28.567 に答える
0

validates_existence gem https://github.com/perfectline/validates_existenceを使用します

于 2012-05-24T15:51:39.530 に答える