我试图将一些重复的逻辑分解为concern。部分重复逻辑是state_machine。
简化,Database
,Site
,SftpUser
等等包含以下内容:
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的子类吗?我得不到的东西?我很关注忧虑的概念。
答案 0 :(得分:6)
好。我感觉真的很蠢。不应该extend
一个带有模块的类,而是include
该模块。明显。
# Tested with:
class DeployableDouble
include Deployable
end
一旦你写完,你就会监督这些事情。此外,不需要扩展ActiveRecord::Base
,因为state_machine只是普通的Ruby,并且可以处理通用的Ruby对象。