2013-08-20 7 views
8

私はhas_many関連に対して複数の選択ボックスを持っています。 paramsのように来る:私は、人々はちょうど彼らがそれで欲しいものは何でも置くことができないので、それを自分自身を承認したいと思いますので、強いパラメータを使用してPundit gemでIDの配列を認証

foo_ids: ["1", "2", "3"] 

、私はこの属性を許可していません。

def update 
    bar.foos = authorized_foos 
    bar.update(baz_params) 
    respond_with bar 
end 

private 

    def authorized_foos 
    foos = Foo.find(params[:baz][:foo_ids]) 
    foos.each do |foo| 
     authorize foo, :manage? 
    end 
    end 

このアプローチでは、すべてのfoosを見つけてループし、それぞれを個別に認可するようになります。できればPundit gemでhas_many権限を管理する簡単な方法はありますか?

+2

こんにちはLogan、私はPunditのメンテナーの一人で、ユースケースについて学びたいと思っています。コレクション内のすべてのレコードを単に承認するのか、何らかの形で追加のチェックが必要なのでしょうか?あなたの意見は、あなたの質問を将来のリリースでうまく解決し、他の人にも役立つかもしれません。あなたがコメント[ここ](https://github.com/elabs/pundit/issues/60)を残すことができれば嬉しいです。前もって感謝します! –

+3

誰もがGithubの問題スレッド全体を読むことを救うために。この問題は閉鎖されていますが、基本的にPunditを拡張したり、あなたがこれについてどうやって進むかを変えることで対応できると言っています。 –

答えて

1

これを行う最も簡単な方法はループです。ユーザーの配列から各ユーザーを繰り返し、各ユーザーごとに権限を与えます。例えば 、

users_id_array = [1,2,3,4,5,6] 

private 

    def authorized_users 
    users = User.find(params[:group][:user_ids]) 
    users.each { |u| authorize u, :manage? } 
    ... 
end 

は、これは非常に基本的かつ最も簡単な答えです。

0

私はこれに類似しています。あなたが提供した情報がどれほど少ないかという理由で、私は仮定の範囲を作るつもりです。

  1. あなたは多くのユーザーから多数のユーザーに関連付けられています。これにより、fooは多くのユーザーを持つことができ、ユーザーは多くのfoosのメンバーになることができます。

  2. あなたは(1)を達成するためにモデルを設定する方法を理解しています。あなたがコメントしていない場合は、この回答を編集します。

だから私たちは仕事に、このために働いている必要がありますどのような次のようである:FOOSのコレクション

  1. @foo.usersは、ユーザーのコレクションを返す
  2. @user.foos戻り

上記のアクションをサポートするように設定されたモデルでは、これを行うよりもはるかに簡単です。

class FooPolicy < ApplicationPolicy 
    class Scope < Scope 
    def resolve 
     user.foos 
    end 
    end 
end 

私はあなたが専門家のポイントを見逃していると思います。 Punditでは、ユーザーごとにユーザーごとに承認を行うことができます。したがって、上記のコードでは、ユーザーがグループに属しているグループ(この場合はfoos)のみにスコープしています。

関連する問題