22

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

私はそれを変換したい:

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
4

6 に答える 6

42

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

@obj.assign_attributes( params[:obj] )

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

@obj.valid?

オブジェクトが有効でない.valid?場合は、( を呼び出した後にのみ) を呼び出してエラーを確認できます。

@obj.errors

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

@obj.save

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

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

于 2012-05-23T20:48:16.067 に答える
3

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

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

なぜこのパターンが必要なのかわからない

于 2012-05-23T20:47:12.237 に答える
0

update_attributesメソッドはオブジェクトを検証し、オブジェクトが無効な場合は false を返します。したがって、次のように書くことができます。

if @obj.update_attributes( params[:obj] )
  # That have been update
else
  # Ups, errors!
end
于 2012-05-23T20:46:50.817 に答える
0

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

def valid_with_new_params(hash)
   self.attributes = hash
   valid?
end

しかし、obj が正常に更新された場合とそれ以外の場合に@obj.update_attributes(params[:obj])返されるため、それは不要です。 更新が失敗した場合に使用できるように、メソッドは内部ですべての検証を実行することにも注意してください。truefalseupdate_attributes@obj@obj.errors

于 2012-05-23T20:49:14.413 に答える
0

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

于 2012-05-23T20:45:21.903 に答える
0

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

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

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

@obj.valid?

エラーがないか確認するには

@obj.errors
于 2012-09-19T08:30:33.187 に答える