我目前正在尝试基于父模型属性在子模型上设置CanCanCan授权,但我似乎无法使其正常工作。我需要执行以下操作:
can(:create, Bid) { |b| b.request.status == :open }
因此,在我的情况下,一个请求可以有很多出价,但是您只能在该请求仍处于竞标状态时才能创建出价。
问题在于出价实例始终具有nil
的请求。
我注意到授权先于控制器运行,因此在我在控制器中运行bid_params
之前,它先使用@bid = @request.bids.build(bid_params)
。
我尝试使用load_and_authorize_resource :bid, through: :request
,但这似乎无济于事。
我在做什么错了?
答案 0 :(得分:0)
在尝试使用load_and_authorize_resource
之前,我会尝试“手动”完成。
def create
@bid = @request.bid.find(params[:id])
authorize! :create, @bid
end
您的能力可以用更简单的方式重写为
can :create, Bid, request: { status: :open }
这可行时,也使用
load_and_authorize_resource :request
load_and_authorize_resource through: :request
应该可以工作,您可以删除对authorize!
的“手动”呼叫