【问题标题】:Using cancan to limit listing objects according to roles使用cancan根据角色限制列表对象
【发布时间】:2023-08-05 21:21:01
【问题描述】:

在我的能力.rb 我有

user ||= User.new
if user.has_role? :admin
  can :manage, :all
elsif user.has_role? :collaborator
  can :manage, Task, :user_id => user.id
else
  can :read, Task, :user_id => user.id
end

问题是,在 TasksController 中,当我写这个时:

def index
    @taks = Task.all.order('created_at DESC')
end

当以协作者身份登录时,它不会过滤任务列表:

任务负载 (1.4ms) SELECT "tasks".* FROM "tasks" ORDER BY created_at DESC

但是,当我写这个时:

def index
    Task.all.order('created_at DESC')
end

当以协作者身份登录时,它会过滤:

任务负载 (0.9ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."user_id" = 2

但不订购清单!我不明白为什么它的行为不同,如何在不在控制器中添加额外逻辑的情况下进行过滤和排序?

我正在使用 rails''4.1.4'、'devise''3.3.0'、'cancan''1.6.10'。

【问题讨论】:

    标签: ruby-on-rails-4 devise cancan


    【解决方案1】:

    我刚刚想出了以下解决方案:

    def index
      @tasks = Tasks.accessible_by(current_ability).all.order('created_at DESC')
    end
    

    它确实过滤和排序:

    任务负载 (0.7ms) SELECT "tasks".* FROM "taks" WHERE "tasks"."user_id" = 2 ORDER BY created_at DESC

    由于某种原因,当使用当前能力调用时,它可以工作。

    【讨论】: