2

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

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

应用程序/模型/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

配置/路由.rb

...
devise_for :products

resources :products do
  resources :sizes
end
...

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

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

我四处搜索,并尝试authorize! :index, Ability在索引操作中与 一起尝试can :index, Product, user_id: user.id,但随后用户根本无法访问索引页面。

任何帮助表示赞赏。

4

2 回答 2

2

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

class ProductsController < ApplicationController
  def index
    @products = current_user.products
  end
end
于 2013-05-09T21:20:41.033 回答
1

在 Rails 4 我以这种方式使用:

class ProductsController < ApplicationController
  def index
    Product.all
  end
end

它将根据您的康康舞能力过滤所有产品。在您的情况下user_id: user.id会导致类似的查询SELECT "products".* FROM "products" WHERE "products"."user_id" =

于 2014-05-31T21:02:06.527 回答