0

cancanを使用して、表示されるデータを特定のユーザーグループに制限する際に問題が発生しました。

私のユーザーは多くの製品を持っています。そして、製品には多くのバウチャーがあります。

私のroutes.rbにはこれがあります:

resources :products do
  resources :vouchers
end

ability.rb:

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

そして私のバウチャーコントローラーでは:

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

最後に、私の見解では、現在のユーザーに関連付けられている製品グループのバウチャーのリストを表示しようとしています。

例えば:

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

これにより、製品グループのバウチャーが一覧表示されますが、すべてのユーザーがすべてのバウチャー/製品を表示できます。

私の能力は間違っていると思います。助けてください :)

4

2 に答える 2

0

レコードをフェッチするためのcancanwikiをご覧ください:https ://github.com/ryanb/cancan/wiki/Fetching-Records

を呼び出している場合はload_and_authorize_resource、次の2つのいずれかに似た操作を実行できます。

  def index
  ...
   if params[:product_id]
     @vouchers = @vouchers.where(product_id: params[:product_id])
   end
  ...
  end

load_and_authorize_resourceそのコントローラーアクション@vouchersのパラメーターに基づいて、インスタンス変数を自動的に割り当てる必要があります。accessible_byこれが機能しない場合は、より明示的に定義してください。

if params[:product_id]
  @vouchers = Voucher.includes(:product).where(product_id: params[:product_id]).where(product: { user_id: current_user.id })
end
于 2012-06-29T14:55:34.783 に答える
0

この問題を抱えている他の人のために、私はバウチャーコントローラーで次のことを行う必要がありました:

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

ただし、これにより実際には他のユーザーが結果を表示できなくなりましたが、最初にaccessible_byを使用して製品をロードすると、別のレスキューブロックが必要な例外が発生しました。

于 2012-06-30T13:23:14.060 に答える