20

別のブールフィールドの値に基づいてブールフィールドをfalseに設定しようとしています。ActiveRecordモデルで次のことを試しました。

  before_save :reconcile_xvent

  def reconcile_xvent
    self.xvent_hood = false if !self.xvent_plenum?
  end

しかし、これは機能しません。今、私のユニットテストの多くは次のように失敗します:

ActiveRecord::RecordNotSaved: ActiveRecord::RecordNotSaved

xvent_plenumがfalseの場合、xvent_hoodをfalseに設定するにはどうすればよいですか?

アップデート

動作するものは次のとおりです(そのうちのいくつかは以下のコメント/回答から来ています):

before_validation :reconcile_xvent

def reconcile_xvent
  if self.xvent_hood?
    self.xvent_hood = false unless xvent_plenum?
  end
end

「ifself.xvent_hood?」なしでそれを機能させることができませんでした。部....

4

2 に答える 2

26

before_save検証に合格した後にのみ呼び出されますあなたがする必要があるのはではなく上に移動reconcile_xventすることですbefore_validationbefore_save

そのメソッドを保持するbefore_saveと、それxvent_hoodがnullであると見なされ、nullがないかどうかをチェックする検証がある場合、 getsが呼び出されるxvent_hood前に失敗します。before_saveこれはおそらく、エラーが発生した理由を説明していRecordNotSavedます。

もう1つ覚えておくべきことは、ブール型のプロパティがある場合は、も使用できないということvalidate_presence_ofです。http://alexanderwong.me/post/16084280769/rails-validate-presence-of-boolean-and-arrays-mongoidを参照してください

于 2012-08-02T17:53:39.723 に答える
18

私もこの問題にぶつかりました。コードの最初のブロックの問題は、xvent_hood値をfalseに割り当てていることです。この値は、before_saveメソッドによって返されます。

に従って

コールバックのキャンセル

before_ *コールバックがfalseを返す場合、それ以降のすべてのコールバックと関連するアクションはキャンセルされます。after_ *コールバックがfalseを返す場合、それ以降のコールバックはすべてキャンセルされます。コールバックは、最後に呼び出されるモデルのメソッドとして定義されたコールバックを除いて、通常、定義された順序で実行されます。

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.htmlから

于 2012-10-23T04:53:18.773 に答える