2014-01-21 3 views
10

В моем проекте у меня довольно распространенное пространство имен «admin».Использование Pundit с пространством имен

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

Я использую драгоценный камень Pundit для установки надлежащего разрешения, но мне было трудно использовать его с контроллерами в пространстве имен. мои политики организованы ниже:

-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 модели в качестве ресурса, он будет искать UserPolicy, не Admin::UserPolicy

См. here, here и here.

Вы могли указать policy class на вашей User модели, но это не реально решить проблему пространства имён контроллера, так как Пандит собирается вывести класс политики от модели, независимо от того, где вы разрешаете.

4

С новым объединенным commit вы можете это сделать.

Он будет работать автоматически.

ОБНОВЛЕНИЕ:

От 0,3 версии эффективно удаляется без замены функции. Однако функцию пространства имен можно получить в ветке пространства имен на github.

Вы можете ознакомиться с обсуждением функции в issue on github.

Мое предложение для людей, которые хотят использовать пространства имен с pundit - пока не используют. Сделайте перед фильтром доступ к запрещенной области, такой как панель управления admin, и оставьте правила модели авторизации в файлах pundit. Таким образом вы сможете использовать pundit без хаков и проблем.

+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