2011-11-17 72 views
0

我繼承了在我的控制器中工作的資源,並使用cancan進行授權。不過,我寫一個需要的能力有問題。在控制器中嵌套繼承資源的Cancan功能

我可以在2種方式來顯示特定的順序:

/profile/123/orders/321 
/store/456/orders/321 

在控制器:

class OrdersController < ApplicationController 
    inherit_resources 
    belongs_to :profile, :store, :optional => true 
    load_and_authorize_resource 
    ... 
end 

角色是:用戶(HAS_ONE:在模型輪廓)和管理器(HAS_ONE:存儲在模型)

(字)的要求是:

  • 經理可以在(他屬於)他的 商店的上下文中顯示訂單。
  • 經理不能以任何用戶的 配置文件的情況下顯示順序(S)(訪問應該被拒絕)
  • 用戶可以在他的個人資料
  • 用戶無法顯示順序(S)的 上下文顯示順序(S)任何 存儲(拒絕)的上下文

我無法滿足這些要求,也許我應該以特殊方式或實際上以兩種方式加載資源?直覺對我說,在這兩種情況下,訂單的訪問應基於對父資源的訪問。 謝謝你的幫助。

回答

0

如果您對配置文件和商店擁有您的ability.rb文件的權限,那麼您也可以授權父母。即是這樣的:

load_and_authorize_resource :profile 
load_and_authorize_resource :store 
load_and_authorize_resource :order 

或者你可以當它在康康舞維基描述做:

多態關聯

比方說,任務既可以通過一個多態分配到項目或事件協會。一個數組可以傳遞給:through選項,它將使用它找到的第一個數組。

load_resource :project 
load_resource :event 
load_and_authorize_resource :task, :through => [:project, :event] 

這將同時檢查@project和@event變量,通過取哪一個存在的任務。請注意,這只是加載父模型,如果你想授權父代,你需要通過before_filter來完成,因爲涉及到特殊的邏輯。

before_filter :authorize_parent 
private 
def authorize_parent 
    authorize! :read, (@event || @project) 
end