使用cancan根据角色限制列表对象

时间:2014-10-27 01:40:44

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

在我的能力中。我有

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'。

1 个答案:

答案 0 :(得分:0)

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

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

它会过滤和订购:

  

任务加载(0.7ms)SELECT" tasks"。* FROM" taks"在哪里"任务"。" user_id" = 2 ORDER BY created_at DESC

出于某种原因,当使用当前能力进行呼叫时,它可以正常工作。