私は非常に初心者の質問があります。更新する前に、モデルのオブジェクトが新しいパラメーターで有効であることをどのように確認できますか?
私はそれを変えたいです:
def update
@obj = SomeModel.find( params[:id] )
if @obj.update_attributes( params[:obj] )
# That have been updated
else
# Ups, errors!
end
end
そのようなものに:
def update
@obj = SomeModel.find( params[:id] )
if @obj.valid_with_new_params( params[:obj] )
@obj.update_attributes( params[:obj] )
else
# Ups, errors!
end
end
保存せずに属性を更新するには、次を使用できます
@obj.assign_attributes( params[:obj] )
次に、オブジェクトが有効かどうかを確認するには、次を呼び出すことができます
@obj.valid?
オブジェクトがnotである場合、(.valid?
を呼び出した後でのみ)エラーを表示できます。
@obj.errors
オブジェクトisが有効な場合は、次の呼び出しで保存できます
@obj.save
ただし、このすべて通常は必要ありません。オブジェクトが有効でない場合、ActiveRecordはオブジェクトをデータベースに保存しないため、コントローラーアクションを終了すると、属性の変更はすべて忘れられます。
また、無効なレコードはデータベースに保存されないので、いつでも再びObject.find()を呼び出して元のオブジェクトを取得できます。
valid?
メソッドを呼び出して、検証を実行できます。
これは、検証の一部がデータベース内の他のオブジェクトの状態に依存している場合、後続の保存が成功することを保証するものではありません。検証に関連付けられていない理由(例:外部キー制約)で保存が失敗することもある
なぜこのパターンが必要なのかわかりません
保存せずに属性を更新するには
@obj.attributes = params[:obj] 0r
@obj.attributes = {:name => “Rob”}
次に、オブジェクトが有効かどうかを確認するには
@obj.valid?
エラーの有無を確認するには
@obj.errors
渡された引数が有効なオブジェクトを生成しない場合、オブジェクトは保存されないため、問題なく使用できます。エラーがある場合は、@obj.errors
配列を使用して確認できます。
update_attributes
メソッドはオブジェクトを検証し、オブジェクトが無効な場合はfalseを返します。だから、あなたはただ書くことができます:
if @obj.update_attributes( params[:obj] )
# That have been update
else
# Ups, errors!
end
答えは、メソッドを定義できることです
_def valid_with_new_params(hash)
self.attributes = hash
valid?
end
_
ただし、objが正常に更新された場合は@obj.update_attributes(params[:obj])
がtrue
を返し、そうでない場合はfalse
を返すため、これは不要です。また、内部的に_update_attributes
_メソッドが_@obj
_に対してすべての検証を実行するため、更新が失敗した場合に_@obj.errors
_を使用できることにも注意してください。