1

私のアプリケーションでは、すべてのユーザーが独自のタスクを読み取ることができます。2 番目のコントローラーはモデレーターのみが使用でき、モデレーターはすべてのタスクを表示できます。

# accessible for every user
# every user should see only own tasks, 
# but at the moment all moderators see all tasks
class TasksController < ActionController::Base
  load_and_authorize_resource
end

# only accessible for moderators, all tasks
class TasksModeratorController < ActionController::Base
  load_and_authorize_resource :task, :parent => false
end


# Ability
# Moderators can read all tasks
if user.moderator?
  can :read, Task
end
# All users can read there own tasks
can :read, Task, :user_id => user.id

TasksController のタスクを制限して、自分のタスクのみをモデレーターにも表示するが、TasksModeratorController のすべてのタスクを表示するにはどうすればよいですか? または、これを処理するためのより一般的な方法はありますか?

4

1 に答える 1

1

通常、アクセス権はコントローラーに依存しないため、能力はモデルです。しかし、 current_ability を介してコントローラーをアビリティイニシャライザーに渡すことによって明示的にするだけではありません。より多くの情報を能力に渡すというこの慣行は奨励されていると思います。だから私の未テストの2セント

# in ApplicationController
def current_ability
  @current_ability ||= Ability.new(current_user, self)
end

# in Ability
def initialize(user, controller)

# all same as before ...
# Moderators can read all tasks if using TasksModeratorController or any subclass
if user.moderator? && controller.is_a?(TasksModeratorController)
  can :read, Task
end

# All users can read there own tasks
can :read, Task, :user_id => user.id
于 2012-05-11T22:38:12.667 に答える