別のブールフィールドの値に基づいて、ブールフィールドを 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
「if self.xvent_hood?」の部分なしで動作させる方法がわかりませんでした...
ベストアンサー1
before_save
はのみreconcile_xvent
検証が成功した後に呼び出されます。必要なのはbefore_validation
、before_save
そのメソッドを に保持すると、before_save
が null であると判断されxvent_hood
、 null かどうかをチェックする検証がある場合は、が呼び出されるxvent_hood
前に失敗します。これがおそらくエラーが発生した理由です。before_save
RecordNotSaved
もう一つ覚えておいて欲しいのは、ブール型プロパティがある場合には も使用できないということですvalidate_presence_of
。http://alexanderwong.me/post/16084280769/rails-validate-presence-of-boolean-and-arrays-mongoid