State Machine Gem + Rails 4:未定义的方法`state_machine&#39; for#<class:0x007faffc93fd60> </class:0x007faffc93fd60>

时间:2014-05-01 00:01:50

标签: ruby-on-rails state state-machine

我已经安装了宝石

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中我可以成功创建一条记录但是状态值没有了。

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

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

此人(state_machine gem integration with rails 4)遇到了同样的问题,需要重启服务器。我已经多次重启服务器,以及关闭终端然后启动服务器。

My Gemfile.lock有这个文件 - state_machine(1.2.0),捆绑包没有显示错误。

编辑:

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

1 个答案:

答案 0 :(得分:2)

我认为你有两种选择。

选项1

要么放弃:require => 'state_machine/core'部分。所以新行看起来就像这样:

gem 'state_machine'

选项2

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

extend StateMachine::MacroMethods

例如:

require 'state_machine/core'

class Vehicle
  extend StateMachine::MacroMethods

  state_machine do
    # ...
  end
end

说明

加载文件'state_machine/core'会停用Class的扩展名。这意味着除非您致电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'

原始版本不再维护(我不确定原因)但是新版本会不时更新,这可能会阻止一些错误。