我正在使用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
,但用户根本无法访问索引页面。
感谢任何帮助。
答案 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" =