tkm9

自分向け技術メモ(?)

State Machine の エラー:NoMethodError: protected method `around_validation'

state machine の gem を導入したら、

NoMethodError: protected method `around_validation' called for #< StateMachine::Machine:0x007f60dfc57f28 >

といったエラーが出たのでその対応メモ。

環境

状況

state machine を導入するとバリデーション実行時エラーとなる。

エラー:

$ bundle exec rails c
Loading development environment (Rails 4.2.0)
  > e = Entry.new
 => #<Entry id: nil, title: nil, body: nil, status: nil, created_at: nil, updated_at: nil>

  > e.save
   (0.2ms)  begin transaction
   (0.2ms)  rollback transaction
  NoMethodError: protected method `around_validation' called for #<StateMachine::Machine:0x007f60df3c52e8>

対応

NoMethodError: protected method `around_validation' in Rails 4.1.0.beta1 · Issue #295 · pluginaweek/state_machine · GitHub でのやりとりを見る限り

  • state_machines-activerecord という gem をインストールする
  • around_validation メソッドを public にする

くらいしかなさそう。

今回は後者の対応として以下内容の config/initializers/state_machine.rb を作成しました。

# Rails 4.1.0.rc1 and StateMachine don't play nice
# https://github.com/pluginaweek/state_machine/issues/295

require 'state_machine/version'

unless StateMachine::VERSION == '1.2.0'
  # If you see this message, please test removing this file
  # If it's still required, please bump up the version above
  Rails.logger.warn "Please remove me, StateMachine version has changed"
end

module StateMachine::Integrations::ActiveModel
  public :around_validation
end

issue にあったやつのコピペです。

しかし、state machine はもうメンテしないのかな?