12

私のプロジェクトでは、かなり一般的な名前空間「admin」があります。

namespace :admin do
    resources :users, except: :show
end

Pundit gem を使用して適切な承認を設定していますが、名前空間内のコントローラーで使用するのは難しいことがわかりました。私のポリシーは以下のように構成されています

-policies
    -admin
        user_policy.rb
    application_policy.rb
    admin_policy.rb
    awesome_policy.rb

コントローラーに非常に似ています。

ただし、コントローラー内で「承認」メソッドを使用すると、アプリが「ユーザーポリシーを見つけることができません」というエラーだけが表示されます。私の UserPolicy は次のようになります。

class Admin::UserPolicy < AdminPolicy
end

Punditに名前空間内のこれらのポリシーを表示させるにはどうすればよいですか?

4

4 に答える 4

4

新しいマージされたコミットを使用すると、これを行うことができます。

自動的に機能します。

アップデート:

バージョン 0.3 からは、機能を置き換えることなく効果的に削除されます。ただし、名前空間機能はgithubの名前空間ブランチで取得できます。

githubで問題の機能に関する議論を見ることができます。

pundit で名前空間を使用したい人への私の提案 - まだ使用しないでください。管理者ダッシュボードなどの制限された領域にアクセスする前にフィルターを作成し、承認モデル ルールを pundit ファイルに残します。そうすれば、ハックや問題なく pundit を使用できるようになります。

于 2014-05-28T04:44:25.323 に答える
3

簡単な答え: Pundit にコントローラー名前空間固有のポリシーを使用させることはできません。

長い答え: Pundit はリソース (モデル) を調べて、使用する Policy クラスを決定します。そのため、モデルのインスタンスをリソースとして渡すときはいつでも、ではなくUserを探します。UserPolicyAdmin::UserPolicy

ここここここを参照してください。

モデルにポリシー クラスを指定することもできますが、承認する場所に関係なく、Pundit がモデルからポリシー クラスを派生させるため、名前空間コントローラーの問題は実際には解決されません。User

于 2014-02-11T04:56:35.503 に答える
2

onemanstartup は、これは現在自動的に機能するはずであると述べていますが、名前空間ポリシーを機能させることはできませんでしたが、許容できるとわかったのは次のとおりです。

あなたの場合、AdminPolicyで、次のようなカスタムアクション名を追加しました

def new_user?
  some code
end

そして、私の Admin::UserController#new アクションで

def new
  authorize @user, :new_user?
end
于 2014-08-04T02:34:45.553 に答える