Just do IT

思うは招く

Rails before_xxx で throw(:abort) をする意味

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

参考