2014-01-21 12 views
10

私のプロジェクトでは、かなり一般的な名前空間 "admin"を持っています。名前空間でPunditを使う

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

私はPundit gemを使用して適切な認証を設定していますが、ネームスペース内でコントローラを使用することは困難でした。私のポリシーは以下のように構成されています。

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

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

しかし、私が "authorize"メソッドを使用している場合、私は何もせず、アプリケーションは "UserPolicyを見つけることができません"と通知します。私UserPolicyは、次のようになります。

class Admin::UserPolicy < AdminPolicy 
end 

だから私は評論家は、名前空間内のこれらのポリシーを確認するために何をすべき、問題は何ですか?

答えて

2

短い答え:Punditはコントローラの名前空間固有のポリシーを使用できません。

長い答え:評論家が使用するポリシーのクラスを決定するために、リソース(モデル)を見て、あなたがリソースとしてでUserモデルのインスタンスを渡す任意の時間は、Admin::UserPolicy

UserPolicyを探すことではないだろう

here,hereおよびhereを参照してください。

あなたはあなたUserモデルにpolicy classを指定することもできますが、評論家は関係なく、あなたが許可しているところの、モデルからポリシークラスを派生するために起こっているので、これは本当にあなたの名前空間コントローラーの問題を解決していません。

4

新しいマージcommitでこれを行うことができます。

自動的に動作します。

UPDATE:

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

フィーチャーの説明はissue on githubでご覧になれます。

名声を持つ名前空間を使いたい人には、私の提案があります。まだ使用しないでください。フィルタの前に作成して、管理ダッシュボードなどの制限された領域にアクセスし、認定モデルのルールを評価ファイルに残します。それはあなたがハックや問題なしに専門家を使用することができる方法です。

+1

+1これは確かに動作しません最新の宝石。 – markquezada

+0

最新の最新バージョンでは再び動作しません。しかし、私が使ったフォークのhttps://github.com/coryodaniel/regulatorがあり、それは私のためにうまくいく。 – lakesare

2

onemanstartupは現在自動的に動作するはずですが、名前空間付きのポリシーを実行することができませんでしたが、ここで私は受け入れられると判断しました。あなたのケースでは

、AdminPolicyに、私は私の管理者で

def new_user? 
    some code 
end 

、その後、同様に、カスタムアクションの名前を追加しましたが:: UserControllerで#新しいアクション

def new 
    authorize @user, :new_user? 
end 
+0

優れた作品!私が立ち往生している問題を修正しました!よくやった! @dminor – SupremeA