ฉันมีตัวอย่างด้านล่าง:
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