我继承了在我的控制器中工作的资源,我使用cancan进行授权。但是,我在编写所需能力时遇到了问题。
我可以通过两种方式显示特定顺序:
/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:存储在模型中)
要求(单词)是:
我无法满足这些要求,也许我应该以特殊方式加载资源或实际上以两种方式加载资源? Intuition对我说,对订单的访问应该基于两种情况下对父资源的访问。 谢谢你的帮助。
答案 0 :(得分:0)
如果您拥有个人资料和商店的ability.rb文件的权限,那么您也可以只授权父级。即像这样的东西:
load_and_authorize_resource :profile
load_and_authorize_resource :store
load_and_authorize_resource :order
或者你可以按照CanCan wiki中描述的那样做:
多态关联
假设任务可以通过多态关联分配给项目或事件。数组可以传递给: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