4

我试图将一些重复的逻辑分解为关注点。部分重复逻辑是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

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

实际上是included do实现这个的正确回调吗?这可能是一个问题state_machine,它需要 ActiveRecord::Base 的子类吗?我没有得到什么?我对关注的概念很陌生。

4

1 回答 1

6

好的。我觉得自己真的很愚蠢。一个不应该extend是一个带有模块的类,而是include那个模块。明显地。

# Tested with:
class DeployableDouble
  include Deployable
end

您在编写后监督的这些事情之一。此外,ActiveRecord::Base不需要扩展,因为 state_machine 只是普通的旧 Ruby 并且适用于通用 Ruby 对象。

于 2013-12-05T11:07:32.370 回答