Rails: before_save を使用して別のフィールドに基づいてフィールド値を変更するにはどうすればよいでしょうか? 質問する

Rails: before_save を使用して別のフィールドに基づいてフィールド値を変更するにはどうすればよいでしょうか? 質問する

別のブールフィールドの値に基づいて、ブールフィールドを 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_validationbefore_save

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

もう一つ覚えておいて欲しいのは、ブール型プロパティがある場合には も使用できないということですvalidate_presence_ofhttp://alexanderwong.me/post/16084280769/rails-validate-presence-of-boolean-and-arrays-mongoid

おすすめ記事