0

これが私のAbility.initializeです:

user ||= User.new # handle guest user

if user.has_role? :admin
    can :manage, :all
elsif user.has_role? :moderator
    can :read, :all
    can :update, :all do |clazz|
        clazz.managed_by? user
    end
elsif user.has_role? :participant
    can :update, :all do |clazz|
        clazz.owned_by? user
    end
    can :read, :all do |clazz|
        clazz.visible_to? user
    end
else
    raise "Role decoding in Ability fell through"
end

終わり

私の意図は、主要なドメインクラス[ユーザー、ラウンド、参加者、質問、およびプログラム]がすべてowned_by?、managed_by?を定義することです。とvisible_to?方法。また、そのうちの1つを更新または表示できるようにするためのルールが一律に適用されます。

しかし、私は次のようなステートメントを信じています:

    can :update, :all do |clazz|
        clazz.owned_by? user
    end

clazz.owned_byにさえ到達しないと思うので、私が思うことをしていませんか?ライン。

誰かが私をまっすぐにすることができますか?私はドキュメントを見て、それが言っていることを私が使用しているテクニックと実際に結び付けることができませんでした。ありがとう!

4

1 に答える 1

2

:allは単なるシンボルであり、すべてのクラスのイテレータではないと思います。ここで行っているようにすべてを明示的にリストするか、このソリューションを使用してすべてのモデルのリストを取得できます:https ://stackoverflow.com/a/516605/2033014

[User, Round, Participant, Question, Program].each do |klass|
  can :update, klass, klass.owned_by?(user)
  can :read, klass, klass.visible_to?(user)
end
于 2013-02-02T19:34:46.987 に答える