在 AASM 中添加状态包括创建一个新的 State 对象,然后将其添加到 AASM::StateMachine[User].states 数组中,如下所示:
def create_state(name, options)
@states << AASM::SupportingClasses::State.new(name, options) unless @states.include?(name)
end
这里要注意的是,一旦设置状态,它就不允许覆盖状态。如果再次设置同名状态,create_state 方法将忽略它。为了解决这个问题,你可以在你的用户模型中使用这样的东西:
# this will remove the state with name :name from the states array
states = AASM::StateMachine[self].states
states.delete(states.find{ |s| s == :name })
# ... so we can define the state here again
aasm_state :name ...
如果您只是重新定义状态,那么您现在应该没问题。但是如果你想完全移除状态,你也应该取消定义在 aasm_state 方法体中定义的方法。应该可以调用类似的东西:
undef_method :name
事件的情况应该相同(只需在代码中使用“事件”而不是“状态”)。理想情况下,使其成为覆盖 AASM 模块中定义的方法的用户模型的类方法。在状态的情况下,它看起来像这样:
def aasm_state(name, options={})
states = AASM::StateMachine[self].states
states.delete(states.find{ |s| s == name.to_sym })
super(name, options)
end
警告:我可能不对。此代码未经测试,我只是通过查看 AASM 的源代码才弄清楚的。