CanCanCanCan根据子记录的父级属性授权创建子记录

时间:2019-02-25 22:40:01

标签: cancancan

我目前正在尝试基于父模型属性在子模型上设置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,但这似乎无济于事。

我在做什么错了?

1 个答案:

答案 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!的“手动”呼叫