Rails
RSpec

【Rails】 before_update, before_createのコールバックでfalseを返すだけの処理をすると、レコードが保存されない

問題コード

CIテストの処理をしている際にこの問題を発見しました。
該当のコードは以下のようになります。

app/model/sample.rb
class Sample < Example

  before_create :assign_taxable

  private

  def assign_taxable
    self.tax = false
  end

原因

上記のコードにより、モデル作成前に assign_taxable コールバックが呼ばれる訳ですが、このfalseが曲者です。
本来、Activerecordのsaveメソッド自体が失敗した場合も false が返されます。
その後、raiseエラーによりRecordNotFoundがキャッチされてしまいます。
そのため、今回のコールバックもraiseエラーにキャッチされてしまったのですね、、、

解決方法

ひとまず、falseを最後に返すようなコールバックにしなければ良いので、最後に nil を追加しました。
これにより、RecordNotFoundをキャッチすることがなくなりました。

app/model/sample.rb
class Sample < Example

  before_create :assign_taxable

  private

  def assign_taxable
    self.tax = false
    nil <- これを追加
  end

参考文献