模块中不能包含state_machine

时间:2016-06-07 16:31:58

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

我正在尝试在两个模型中使用一个状态机并让它们在模块中共享

module Schedulable
 state_machine :state, initial: :unscheduled
end

class Install < ActiveRecord::Base
 include Schedulable
end

我收到以下错误

NameError: undefined local variable or method `state_machine' for Schedulable:Module

如何从模块中正确包含状态机?我正在使用最新版本的state_machines gem

2 个答案:

答案 0 :(得分:1)

状态机依赖于ActiveRecord模型,因此您需要制作类似关注的模块。

module Schedulable
  extend ActiveSupport::Concern
  included do
    state_machine :state, initial: :unscheduled
  end
end

答案 1 :(得分:-2)

下面是一个类,它说明了如何通过调用该类之外的方法向类添加行为。您需要将方法定义替换为具有状态机代码的方法定义。

#!/usr/bin/env ruby

module ModifyClass
  def self.add_foo_class_method(klass)
    class << klass
      def foo
        puts 'I am foo.'
      end
    end
  end
end

class C
  ModifyClass.add_foo_class_method(self)
end

C.foo # => "I am foo."

要将此更多地转换为您的上下文,我认为它看起来像这样:

module StateMachineAdder
  def self.add(klass)
    class << klass
      #  state_machine ...
    end
  end
end

class MyModel_1
  StateMachineAdder.add(self)
end


class MyModel_2
  StateMachineAdder.add(self)
end

或者,您可以在一个类中定义常见行为(例如在类定义中对state_machine的调用,以及两个模型中包含相同或大部分相同行为的方法),然后将您的2个模型子类化为该类。这可能是最简单的解决方案。例如:

class XyzModelBase
  state_machine ...

  # Any methods common to both base classes can go here
  def foo
    # ...
  end
end

class XyzModelFoo < XyzModelBase
  # ...
end

class XyzModelBar < XyzModelBase
  # ...
end

#