before_save とは
- オブジェクトがsaveされる前に発動されるコールバック
- 引数としてメソッドが渡された場合、それをクリアしないとsaveされない
- バリデーションの一種
Rails 4 での仕様
- before_xxx では、false を返した場合のみ保存処理が停止していた
- nil の場合は処理が続行される
Rubyだとnilも偽として扱われるのに、これではまぎらわしい!
Rails 5.1以降での仕様
この落とし穴を避けるために仕様が変更された。
- before_xxx で false を返してもそのまま処理が続行される
- 処理を停止したい場合は
throw :abort
する
例
before_save :ensure_admin def ensure_admin throw(:abort) unless self.admin end