使用CanCan如何授权用户编辑关联的子模型?

时间:2013-02-20 10:43:37

标签: ruby-on-rails cancan

我有这样的模型结构。

User
 |
 +-- Order
      |
      +-- OrderItem
           |
           +-- OrderItemNote

订单与用户保持直接关系,因此我可以在:user_id => user.idAbilityUser.role? :customer进行:user_id,以便让他们编辑自己的订单。

但是,如果没有向OrderItemOrderItemNote添加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

2 个答案:

答案 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如果需要的话)