CanCan不会过滤索引中的@products

时间:2013-05-09 20:49:34

标签: ruby-on-rails cancan

我正在使用Devise和CanCan开发Rails 3.2应用程序。

我的用户模型是User,我想将对Product资源的访问限制为User创建的访问权限。相关代码片段:

应用程序/模型/ ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    if user
      can :manage, Product, user_id: user.id
    end
  end
end

应用程序/控制器/ products_controller.rb

class ProductsController < ApplicationController
  load_and_authorize_resource
       ..
end

配置/ routes.rb中

...
devise_for :products

resources :products do
  resources :sizes
end
...

一切都按预期工作:用户无法查看,编辑等......不是由他们创建的产品。但问题是,如果用户访问/ products的产品索引,那么所有产品都可见。

如何在索引页面中过滤相关产品?

我在谷歌上搜索,并在{1}}的索引操作中尝试authorize! :index, Ability,但用户根本无法访问索引页面。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

这不是真正的授权问题。相反,您应该在产品控制器的索引操作中查询范围。例如:

class ProductsController < ApplicationController
  def index
    @products = current_user.products
  end
end

答案 1 :(得分:1)

在Rails 4中我用这种方式:

class ProductsController < ApplicationController
  def index
    Product.all
  end
end

它会根据您的cancan功能过滤所有产品。在您的情况下user_id: user.id会产生SELECT "products".* FROM "products" WHERE "products"."user_id" =

之类的查询