1

我有一个这样的模型结构。

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

订单与用户有直接关系,所以我可以:user_id => user.idAbility课堂上做User.role? :customer(例如)让他们编辑自己的订单。

但是,没有添加:user_idOrderItemOrderItemNote我不知道如何配置 CanCan 以允许用户编辑自己的对象OrderItemOrderItemNote对象。

任何人都可以帮忙吗?

更新:

我选择了 jvnill 的答案,因为我使用的是 RailsAdmin(而且做一个 Ability 类比 . 更简单load_resource。在正常情况下,CanCanload_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在这种情况下)视为数据库字段引用,而不是通过模型(我尝试了一些使用虚拟属性等的技巧来提供一个order_id或什至user_id除了真实数据库字段之外的任何东西名称无法识别。) - 我在有限的时间内进一步调查此问题,我将这些笔记留给我自己,以便稍后查看。

最后我认为没有必要进行更深层次的嵌套,并将注释包含在订单项本身中,因此模型如下:

User
 |
 +-- Order
      |
      +-- OrderItem (which includes a note)
4

2 回答 2

2

最简单的方法是这样的

can :manage, OrderItem, order: { user_id: user.id }
can :manage, OrderItemNote, order_item: { order: { user_id: user.id } }
于 2013-02-20T11:08:17.880 回答
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如果需要)

于 2013-02-20T11:24:33.727 回答