1

最近、アプリの 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 メソッドはそれを無視します。この問題を解決するには、 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 のソース コードを調べてわかったことです。

于 2008-11-11T20:21:38.757 に答える