1

国が米国にないかどうかをチェックする条件があれば、私はこれを持っています

 if params[:address][:country] != 'United States'
  logger.info "I am in here"
  @address.errors.add(:base, "We're sorry, you cant update your address")
  @address.errors.add(:country, "We're sorry, you cant update your address")
end

if @address.update_attributes(params[:address])
  flash[:notice] = 'Information was successfully updated.'

しかし、オブジェクトのベースにエラーを追加すると停止すると思いましたが、更新を停止するものはなく、フラッシュ通知が常に表示されます...これを停止して代わりにフラッシュエラーを追加するにはどうすればよいですか?

4

1 に答える 1

5

エラー経由でランダムに追加して@address.errors.add()も、レコードが無効になることはありません。そのため、への呼び出しupdate_attributesがまだ発生しています (検証エラーをスローしていません)。私の知る限り、適切に機能するにerrors.add()は、Rails 検証メカニズム内で発生する必要があります。そうしないと、奇妙な動作が発生します。

たとえば、これをチェックしてくださいrails console

# assume a valid record
@address = Address.first
@address.valid?  # => true
@address.errors.add(:random_error, "random error")
@address.errors  # => {:random_error => ["random error"]}
@address.valid?  # => true
@address.errors  # => [] - call to valid? caused added error to disappear

valid?エラーを追加した後の への呼び出しが期待されますfalseが、そうではありません。また、追加したばかりのエラーをクリアすることにもなります。

これをモデルに移動することはできないとおっしゃいましたが、実際にはそこが適切な場所です。アクティブ レコードの検証の詳細については、こちらを参照してください。すべての例で、モデルで検証が行われていることに注意してください。

于 2012-06-20T01:08:14.913 に答える