2

私は、Devise と CanCan を使用して Rails 3.2 アプリケーションに取り組んでいます。

私のユーザー モデルはユーザーで、製品リソースへのアクセスをユーザーが作成したものに制限したいと考えています。関連するコード スニペット:

アプリ/モデル/能力.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

config/routes.rb

...
devise_for :products

resources :products do
  resources :sizes
end
...

すべてが期待どおりに機能しています。ユーザーは、自分が作成したものではない製品を表示、編集などできません。しかし問題は、ユーザーが /products の製品インデックスにアクセスすると、すべての製品が表示されることです。

インデックス ページで関連製品をフィルタリングするにはどうすればよいですか?

グーグルで検索してauthorize! :index, Ability、index アクションを と一緒に試してみましたcan :index, Product, user_id: user.idが、ユーザーは Index ページにまったくアクセスできません。

どんな助けでも大歓迎です。

4

2 に答える 2

2

これは実際には承認の問題ではありません。代わりに、製品コントローラーのインデックス アクションで、クエリのスコープを設定する必要があります。たとえば、次のようなものです。

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 に答える