我目前正在尝试基于父模型属性在子模型上设置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
,但似乎没有帮助。
我究竟做错了什么?
在使用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!
的“手动”调用