我有以下代码段:
can :read, Task do |task|
cus = task.case.case_users.ids
cus.each do |id|
cu = CaseUser.find(id)
cu.user_id === user.id
end
end
每个案例都有很多任务。这是任务的授权,所以我想得到任务的情况。每个案例都有一个case_user
。我想确保在允许阅读任务之前,有一个case_user
记录的user_id
等于cancan通过的用户。
如果用户的id在case_users记录数组中,我怎样才能找到任务的相关案例,案例的相关case_users和允许:read
?
在控制台中测试时,它会返回false,但是,cancan仍然可以授予读取记录的权限。
编辑:
我尝试将此readable
方法添加到以下Task
模型中:
def readable?(user_id, task_id)
Task.find(task_id).case.case_users.ids.each do |id|
cu = CaseUser.find(id)
if cu.user_id === user_id
true
end
end
end
我在initialize
类的Ability
方法中有这个:
can :read, Task do |task|
task.readable?(user.id, task.id)
end
答案 0 :(得分:1)
试试这个:
can :read, Task, :case=> { :user_id => user.id }
如果您正在使用CanCan> 1.4,然后在你看来:
<% if can? :read, @case => Task %>
答案 1 :(得分:0)
我会将逻辑移到你的模型中并在你的cancan能力中做这样的事情.rb:
can :read, Task do |task|
task.readable_by_user? user
end
然后添加readable_by_user?函数返回true或false的模型,如下所示:
def readable_by_user?(user)
case.case_users.include? user
end