ユーザー ロールごとにイベント アクセスを制御するガードを AASM で設定することはできますか?
これはかなり一般的な使用例のように思えますが、十分に合意された答えが見つかりません。多くの人は、パーミッション ロジックをコントローラーに保持することを提案しているようです。これは確かに機能しますが、ステート マシン ロジックを複数のコントローラーにブリードすることを意味します。これにはいくつかの理由がありますが、最も重要なのは、SM を更新する際に、モデルと共に変更するすべての使用箇所を見つける必要があることです。
私が思いついた解決策は機能しますが、誰かがより良い解決策を見つけた場合、私は非常に興味があります.
私の解決策:
私のAASMクラスには、次のものが含まれています。
aasm do
before_all_events set_user
event :sample_event, :guard => :user_can? do
transition ...
end
end
private
def set_user user
@user = user
@user ||= User.new
end
def user_can?
@user.some_check_on_attributes?
end
これにより、コントローラー内で次のことが可能になります。
aasm_class.sample_event current_user
現在のユーザーに対して、またはその代わりに確認するには;
aasm_class.sample_event
デフォルトのユーザーと照合します。
これは、この問題にアプローチする最良の方法ですか? 誰かがより良い提案をしていますか?