如何在关注中定义state_machine?

时间:2013-12-05 09:27:24

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

我试图将一些重复的逻辑分解为concern。部分重复逻辑是state_machine

简化,DatabaseSiteSftpUser等等包含以下内容:

class Database < ActiveRecord::Base
  # ...
  state_machine :deploy_state, initial: :halted do
    state :pending
  end
end

我试图将此重构为一个问题:

module Deployable
  extend ActiveSupport::Concern

  included do
    state_machine :deploy_state, initial: :halted do
      state :pending
    end
  end
end

# Tested with:
class DeployableDouble < ActiveRecord::Base
  extend Deployable
end

describe DeployableDouble do
  let(:subject) { DeployableDouble.new }

  it "should have default state halted" do
    subject.deploy_state.must_equal "halted"
  end
end

但是,这不是在state_machnine中实施concern的正确方法,因为这会导致:NoMethodError: undefined method 'deploy_state' for <DeployableDouble:0xb9831f8>。这表明Double根本没有分配一个状态机。

included do实际上是否是实现此权限的正确回调?它可能是state_machine的一个问题,它需要一个ActiveRecord :: Base的子类吗?我得不到的东西?我很关注忧虑的概念。

1 个答案:

答案 0 :(得分:6)

好。我感觉真的很蠢。不应该extend一个带有模块的类,而是include该模块。明显。

# Tested with:
class DeployableDouble
  include Deployable
end

一旦你写完,你就会监督这些事情。此外,不需要扩展ActiveRecord::Base,因为state_machine只是普通的Ruby,并且可以处理通用的Ruby对象。