Cancan能力问题与继承

时间:2012-06-29 14:10:32

标签: ruby-on-rails ruby ruby-on-rails-3 cancan

我在使用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

这列出了产品组中的优惠券,但是,所有用户都可以看到每个优惠券/产品..

我会认为我的能力是错的。请帮助:)

2 个答案:

答案 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加载产品会导致异常需要单独的救援块。