4

ユーザー ロールごとにイベント アクセスを制御するガードを 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

デフォルトのユーザーと照合します。

これは、この問題にアプローチする最良の方法ですか? 誰かがより良い提案をしていますか?

4

2 に答える 2

1

私は、MVC を壊しますが、モデルからアクセスできるようにするsentient_userUser.current gem を使用します。

于 2016-03-24T23:48:20.063 に答える