2014-01-21 47 views
10

在我的項目中,我有相當常見的命名空間「管理」。使用名稱空間的專家

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」。我UserPolicy看起來是這樣的:

class Admin::UserPolicy < AdminPolicy 
end 

那麼是什麼問題,我應該怎麼做才能讓權威人士看到裏面的命名空間的政策?

回答

2

簡短回答:您不能讓專利使用控制器命名空間特定的策略。

龍答:權威人士着眼於資源(模型)來確定要使用的策略類,所以你通過User模型的實例中作爲資源的任何時間,它要尋找UserPolicy,不Admin::UserPolicy

here,herehere

可以指定在User模型policy class,但是這並不能真正解決您的命名空間的控制問題,因爲權威人士會從模型中推導出的策略類,無論你授權在何處。

4

隨着新的合併commit你可以做到這一點。

它會自動工作。

UPDATE:

從0.3版本,而無需更換特徵被有效地清除。但名稱空間功能可以在名稱空間分支github中獲得。

您可以在issue on github中查看功能的討論。

我對那些想要使用命名空間和權威人士的人的建議 - 請勿使用。在過濾器之前進行訪問,以訪問管理控制檯等受限區域,並在授權文件中保留授權模型規則。這樣你就可以在沒有黑客和問題的情況下使用專家。

+1

+1這確實不一起工作最新的寶石。帶有latest_latest版本的 – markquezada

+0

它不再工作。但是我使用了一個fork 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