我有这样的模型结构。
User
|
+-- Order
|
+-- OrderItem
|
+-- OrderItemNote
订单与用户保持直接关系,因此我可以在:user_id => user.id
类Ability
中User.role? :customer
进行:user_id
,以便让他们编辑自己的订单。
但是,如果没有向OrderItem
和OrderItemNote
添加OrderItem
列,我就不知道如何配置CanCan以允许用户编辑自己的OrderItemNote
和{{ 1}}对象。
任何人都可以帮忙吗?
我选择了jvnill的回答,因为我正在使用RailsAdmin(并且更容易做一个Ability类,而不是load_resource
。在正常情况下,CanCan的load_resource
是更好的方法
注意:虽然第一级嵌套由以下方式处理:
can :manage, OrderItem, order: { user_id: user.id }
更深层次的嵌套......:
can :manage, OrderItemNote, order_item: { order: { user_id: user.id } }
...抛出了SQL错误
no such column: order_items.orders
似乎CanCan将更深层次的引用(即本例中的order
)视为数据库字段引用,而不是通过模型(我尝试了一些虚拟属性等技巧来提供{{1或者甚至是order_id
,但是除了真正的数据库字段名称之外的任何东西都不被识别。) - 我在有限的时间内进一步调查这个,我将离开这些笔记,为我自己,所以我可以看看稍后进入。
最后我决定更深层次的嵌套是不必要的,并且在订单项本身中包含了注释,所以模型是这样的:
user_id
答案 0 :(得分:2)
最简单的方法就是这样
can :manage, OrderItem, order: { user_id: user.id }
can :manage, OrderItemNote, order_item: { order: { user_id: user.id } }
答案 1 :(得分:2)
如果加载所有中间对象是有意义的,并且您已经调整了路径(即具有所有必需的ID):
class OrderItemNotesController
load_resource :order, through: :current_user
load_resource :order_item, through: :order
load_resource :order_item_note, through: :order_item
这样,您就不需要任何能力:通过关联检索所有对象。
当然应该适应当前的情况(不要忘记你仍然可以:load_and_authorize_resource
如果需要的话)