2013-02-20 44 views
1

我有這樣的模型結構。使用CanCan如何授權用戶編輯關聯的子模型?

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

訂單保存與用戶有直接關係,這樣我就可以在AbilityUser.role? :customer:user_id => user.id(例如),讓他們編輯自己的訂單。

然而,短期加:user_idOrderItemOrderItemNote的我不知道如何慘慘配置爲允許用戶自行編輯OrderItemOrderItemNote對象。

任何人都可以幫忙嗎?

更新:

我jvnill的答案去了,因爲我使用RailsAdmin(和它的簡單做一個能力類,而不是一個load_resource在正常情況下,康康舞的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 

,看來,把黃燦燦的更深層次的引用(即。 order在這種情況下)作爲數據庫字段引用,而不是通過模型(我嘗試了一些虛擬屬性等技巧來提供order_id甚至user_id,但真正的數據庫字段名稱以外的任何東西都無法識別。) - 在有限的時間內進一步調查,我將留下這些筆記,爲我自己,所以我可以稍後再研究它。

在最後,我決定更深層次的嵌套是不必要的,並且包含在訂單項目本身的說明,因此該模型是像這樣:

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

你通過整個供應鏈LAOD oder_item_notes? – apneadiving 2013-02-20 10:51:44

+0

@apneadiving - 你是什麼意思? - 根據您的需要,用戶可以參考Order(belongs_to:user),OrderItem(belongs_to:order)和OrderItemNote(belongs_to:order_item) – ocodo 2013-02-20 10:55:16

+0

,加載所有中間對象並且可以作爲內置方法執行它可能是有意義的。按照這種方式進行,您可以在訂單級進行授權。 – apneadiving 2013-02-20 11:04:07

回答

2

做最簡單的方法,這是這樣的

can :manage, OrderItem, order: { user_id: user.id } 
can :manage, OrderItemNote, order_item: { order: { user_id: user.id } } 
+3

我更喜歡'load_and_authorize通過:'替代,但無論如何很好的答案,+1很酷的+1 – apneadiving 2013-02-20 11:11:12

+0

。現在我收到你在評論中提出的問題。你每天學習新的東西。 – jvnill 2013-02-20 11:13:48

+0

實際上,因爲我使用這個,我已經將我的'abilities.rb'文件分成了3(但是加載所有對象有時是不可取的......) – apneadiving 2013-02-20 11:16:06

2

如果加載所有中間對象是有道理的,如果你有(一切必要的IDS即)改編路線:

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如果需要的話)

+0

這非常酷,對我的用例來說,我也有Rails_Admin與之抗衡,所以在'Ability'中添加'can'指令是必要的。 (好吧,我的情況是'AdminAbility')。 – ocodo 2013-02-20 11:26:22