我在使用cancan限制显示给特定用户组的数据时遇到了问题。
我的用户有很多产品。产品有很多优惠券。
在我的routes.rb中我有这个:
resources :products do
resources :vouchers
end
在ability.rb中:
can [:create, :update, :read ], Voucher, :product => { :user_id => user.id }
在我的凭证控制器中:
def index
...
if params[:product_id]
@voucher = Voucher.find_all_by_product_id(params[:product_id])
end
...
end
最后,在我看来,我正在尝试在与当前用户关联的产品组中显示优惠券列表。
例如:
http://localhost:3000/products/eef4e33116a7db/voucher
这列出了产品组中的优惠券,但是,所有用户都可以看到每个优惠券/产品..
我会认为我的能力是错的。请帮助:)
答案 0 :(得分:0)
查看can can wiki以获取记录:https://github.com/ryanb/cancan/wiki/Fetching-Records
如果您正在致电load_and_authorize_resource
,您可能会做以下两件事之一:
def index
...
if params[:product_id]
@vouchers = @vouchers.where(product_id: params[:product_id])
end
...
end
load_and_authorize_resource
应根据该控制器操作的@vouchers
参数自动分配accessible_by
实例变量。如果这不起作用,只需更明确地定义它:
if params[:product_id]
@vouchers = Voucher.includes(:product).where(product_id: params[:product_id]).where(product: { user_id: current_user.id })
end
答案 1 :(得分:0)
对于遇到此问题的其他人,我需要在我的优惠券控制器中执行以下操作:
@product = Product.accessible_by(current_ability).find(params[:product_id])
@voucher = @product.vouchers
然而,尽管这实际上阻止了其他用户查看结果,但首先使用accessible_by加载产品会导致异常需要单独的救援块。