Rails可以扫描,如果记录关联,则允许读取

时间:2015-03-04 21:32:37

标签: ruby-on-rails cancan

我有以下代码段:

  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

2 个答案:

答案 0 :(得分:1)

试试这个:

can :read, Task, :case=> { :user_id => user.id }

如果您正在使用CanCan> 1.4,然后在你看来:

<% if can? :read, @case => Task %> 

取自the CanCan Wiki

答案 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