web-dev-qa-db-ja.com

Rails 3-更新前にオブジェクトがパラメータで有効であることを確認します

私は非常に初心者の質問があります。更新する前に、モデルのオブジェクトが新しいパラメーターで有効であることをどのように確認できますか?

私はそれを変えたいです:

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
21
ExiRe

保存せずに属性を更新するには、次を使用できます

@obj.assign_attributes( params[:obj] )

次に、オブジェクトが有効かどうかを確認するには、次を呼び出すことができます

@obj.valid?

オブジェクトがnotである場合、(.valid?を呼び出した後でのみ)エラーを表示できます。

@obj.errors

オブジェクトisが有効な場合は、次の呼び出しで保存できます

@obj.save

ただし、このすべて通常は必要ありません。オブジェクトが有効でない場合、ActiveRecordはオブジェクトをデータベースに保存しないため、コントローラーアクションを終了すると、属性の変更はすべて忘れられます。

また、無効なレコードはデータベースに保存されないので、いつでも再びObject.find()を呼び出して元のオブジェクトを取得できます。

41
Justin

valid?メソッドを呼び出して、検証を実行できます。

これは、検証の一部がデータベース内の他のオブジェクトの状態に依存している場合、後続の保存が成功することを保証するものではありません。検証に関連付けられていない理由(例:外部キー制約)で保存が失敗することもある

なぜこのパターンが必要なのかわかりません

3

保存せずに属性を更新するには

@obj.attributes = params[:obj]   0r
@obj.attributes = {:name => “Rob”}

次に、オブジェクトが有効かどうかを確認するには

@obj.valid?

エラーの有無を確認するには

@obj.errors
0
Beena Shetty

渡された引数が有効なオブジェクトを生成しない場合、オブジェクトは保存されないため、問題なく使用できます。エラーがある場合は、@obj.errors配列を使用して確認できます。

0
Femaref

update_attributes メソッドはオブジェクトを検証し、オブジェクトが無効な場合はfalseを返します。だから、あなたはただ書くことができます:

if @obj.update_attributes( params[:obj] )
  # That have been update
else
  # Ups, errors!
end
0
Flexoid

答えは、メソッドを定義できることです

_def valid_with_new_params(hash)
   self.attributes = hash
   valid?
end
_

ただし、objが正常に更新された場合は@obj.update_attributes(params[:obj])trueを返し、そうでない場合はfalseを返すため、これは不要です。また、内部的に_update_attributes_メソッドが_@obj_に対してすべての検証を実行するため、更新が失敗した場合に_@obj.errors_を使用できることにも注意してください。

0
Gerry