validates いじってないのに valid? で false になるようになった

validates いじってないのに valid? で false になるようになった

作業をすすめていると突然テストが通らなくなって、valid? が false 返すのはいいけど errors みてもなにも message ないし本当にどうしようかと思いました。save(validate: false) でその場をしのいて、結局あとで一つずつコメントアウトしたりして、これ。

Railsでbefore_validationコールバックを使う時の落とし穴 - ぼくたち宇宙人

つまりこれでした。save 時点で is_hoge? 用の boolean を保存しておこうとそういう処理を before_validation にいれとったわけなんですが、わるいことにその代入を一番最後に行っていたので false が代入されると validates は全て通ってるにもかかわらず、valid? は false になっていました。

before_validation :set_is_hoge

def set_is_hoge
  self[:is_hoge] = self[:a] == self[:b] # false だと validation が中断されて死
end

原因をみつけないとぐぐろうにもなにをぐぐっていいかわからない感じで難儀しました。