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 メソッドはそれを無視します。この問題を解決するには、 User モデルで次のようなものを使用できます。
# 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 モジュールで定義されたメソッドをオーバーライドする User モデルのクラス メソッドにします。状態の場合、次のようになります。
def aasm_state(name, options={})
states = AASM::StateMachine[self].states
states.delete(states.find{ |s| s == name.to_sym })
super(name, options)
end
警告: 私は正しくないかもしれません。このコードはテストされていません。AASM のソース コードを調べてわかったことです。