State Machine Gem + Rails 4:未定义的方法`state_machine’for#

我已经安装了gem

gem 'state_machine', :require => 'state_machine/core' 

我捆绑了。

我已将列状态类型字符串迁移到相关表。

我的模型看起来像这样

  belongs_to :user belongs_to :patient validates :patient_id, uniqueness: {scope: [:email]} state_machine :initial => :unseen do event :look do transition :unseen => :seen end end 

当我跑

 rails c Table.all 

我在引用state_machine的模型页面中得到了以下错误

 undefined method `state_machine' for Table 

我注释掉了模型页面的相关部分,删除了该表中之前创建的所有记录,取消注释了模型的state_machine部分,然后从rails c中我可以成功创建记录,但state的值为nil。

同样令人不安的是,当我尝试加载我的首页时,我正在使用Angular,它会进行API调用以检索返回500错误的记录。 控制台日志显示

 NoMethodError (undefined method `state_machine' for #<Class... 

此人( state_machine gem与rails 4集成 )具有相同的问题,需要重新启动其服务器。 我已经多次重启服务器,以及关闭终端然后启动服务器。

我的Gemfile.lock有这个文件 – state_machine(1.2.0),捆绑显示没有错误。

编辑:

尽管能够在删除该表中的所有先前记录(需要注释掉状态机代码)之后成功调用Table.all然后,在取消注释所述代码之后,能够创建并查看记录,如果我然后离开控制台并返回到控制台并重复完全相同的请求(Table.all)它导致未定义方法’state_machine’的相同错误

我想你有两个选择。

选项1

您应该删除:require => 'state_machine/core'部分。 所以新行看起来像这样:

 gem 'state_machine' 

选项2

或者将此行添加到您的class级:

 extend StateMachine::MacroMethods 

例如:

 require 'state_machine/core' class Vehicle extend StateMachine::MacroMethods state_machine do # ... end end 

说明

加载文件'state_machine/core'会禁用Class扩展名。 这意味着除非您调用extend StateMachine::MacroMethods否则方法state_machine无法在任何类中extend StateMachine::MacroMethods

详情请访问: https : //github.com/pluginaweek/state_machine#core-extensions

奖金提示

考虑使用state_machines gem(以“s”结尾)而不是原始的state_machine gem。

 gem 'state_machines' gem 'state_machines-activerecord' 

原来不再维护(我不知道为什么),但新的不时更新,它可能会防止一些错误。