【问题标题】:Cancan Ability Issue with Inheritance继承的康康能力问题
【发布时间】:2012-06-30 21:23:14
【问题描述】:

我在使用 cancan 限制显示给特定用户组的数据时遇到问题..

我的用户有很多产品。而且产品有很多优惠券。

在我的 routes.rb 我有这个:

resources :products do
  resources :vouchers
end

在ability.rb中:

 can [:create, :update, :read ], Voucher, :product => { :user_id => user.id }

在我的 Voucher 控制器中:

  def index
  ...
   if params[:product_id]
     @voucher = Voucher.find_all_by_product_id(params[:product_id])
   end
  ...
  end

最后,在我看来,我试图在与当前用户关联的产品组中显示优惠券列表。

例如:

  http://localhost:3000/products/eef4e33116a7db/voucher

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

我会假设我的能力是错误​​的。请帮忙:)

【问题讨论】:

  • 你打电话给授权!任何地方或在您的控制器中有 load_and_authorize_resource?
  • 是的,抱歉忘记了这一点。 load_and_authorize_resource 包括在内。

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


【解决方案1】:

查看 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 应该根据控制器操作的accessible_by 参数自动分配@vouchers 实例变量。如果这不起作用,只需更明确地定义它:

if params[:product_id]
  @vouchers = Voucher.includes(:product).where(product_id: params[:product_id]).where(product: { user_id: current_user.id })
end

【讨论】:

  • 好的,我正在尝试。我的能力看起来还可以吗?
  • 您的能力看起来不错 - 您面临的问题是您没有使用 cancan 来获取控制器中的记录,而是直接在 Voucher 模型上调用 find 方法。跨度>
  • 啊好的。已经尝试过第一种方法,但这给了我和以前一样的东西。 IE。我可以查看其他用户的优惠券。使用第二种方法,我得到的结果与使用accessible_by(current_ability) 相同 - 即没有结果。
【解决方案2】:

对于遇到此问题的其他人,我需要在我的凭证控制器中执行以下操作:

 @product = Product.accessible_by(current_ability).find(params[:product_id])
 @voucher = @product.vouchers

然而,尽管这确实阻止了其他用户查看结果,但首先使用 access_by 加载产品会导致异常,需要单独的救援块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多