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

ฉันจะค้นหาเคสที่เกี่ยวข้องกับงาน case_users ที่เกี่ยวข้องของเคส และอนุญาต :read ได้อย่างไรหาก id ของผู้ใช้อยู่ในอาร์เรย์ case_users ของเรคคอร์ด

เมื่อทดสอบในคอนโซลจะส่งคืนค่าเท็จ แต่ยังคงสามารถให้สิทธิ์ในการอ่านบันทึกในเวลาที่ไม่ควรเป็น

แก้ไข:

ฉันได้ลองเพิ่มเมธอด 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

person Community    schedule 04.03.2015    source แหล่งที่มา


คำตอบ (2)


ลองสิ่งนี้:

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

หากคุณใช้ CanCan > 1.4 ดังนั้นในมุมมองของคุณ:

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

นำมาจาก CanCan Wiki

person patrick    schedule 04.03.2015

ฉันจะย้ายตรรกะไปยังโมเดลของคุณและทำสิ่งนี้ใน cancan ability.rb ของคุณ:

can :read, Task do |task|
  task.readable_by_user? user
end

จากนั้นเพิ่ม readable_by_user? ฟังก์ชั่นให้กับโมเดลของคุณที่คืนค่าจริงหรือเท็จดังนี้:

def readable_by_user?(user)
  case.case_users.include? user
end
person robbie    schedule 05.03.2015
comment
บางทีฉันอาจไม่ชัดเจนพอ ฉันต้องไปที่กรณีพาเรนต์ของเรกคอร์ดงาน และไปที่ case_users พาเรนต์ของเรกคอร์ดเคส (นั่นคือแบบจำลอง) เมื่อฉันมี case_users ของเคสของงาน ฉันต้องการวนซ้ำแต่ละรายการและอนุญาตให้ดำเนินการอ่านหากผู้ใช้พยายามอนุญาตอยู่ใน case_users user_ids - person ; 05.03.2015