1

我最近不得不在我的一个应用程序中为最新版本的 restful_authentication (github) 扩展 aasm 状态。我删除了“include Authorization::AasmRoles”,从插件中复制了现有的状态和事件,并进行了必要的更改以支持我的帐户模型上的附加“已发布”状态。

有没有人有更清洁的方法来处理这个?即只是覆盖状态事件?我能够按原样使用插件添加新事件,但是我不能只覆盖已经在 restful_auth 中的状态事件,所以我必须删除包含并使用它作为起点自己写出来。

4

1 回答 1

1

在 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 的源代码才弄清楚的。

于 2008-11-11T20:21:38.757 回答