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

问题描述 投票:0回答:1

我目前正在尝试基于父模型属性在子模型上设置CanCanCan授权,但我似乎无法让它工作。我需要做类似以下的事情:

can(:create, Bid) { |b| b.request.status == :open }

因此,在我的情况下,请求可以有多个出价,但您应该只能在请求仍处于开始竞价时创建出价。

问题是,Bid的实例总是会有nil的请求。

我注意到在控制器之前运行授权,所以它在我在控制器中运行bid_params之前使用了我的@bid = @request.bids.build(bid_params)

我尝试过使用load_and_authorize_resource :bid, through: :request,但似乎没有帮助。

我究竟做错了什么?

cancancan
1个回答
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!的“手动”调用

© www.soinside.com 2019 - 2024. All rights reserved.