2016-12-11 2 views
0

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

После долгих и прибегая к помощи чтения вики, я в настоящее время

#controllers/namespaces/unattacheds_controller.rb 
def Namespaces::UnattachedsController 
    authorize_resource class: false 
    def create 
    # does some stuff 
    end 
end 

#models/ability.rb 
def admin 
    can [:create], :namespaces_unattacheds 
end 

#view/ 
<%= if can? :create, :namespaces_unattacheds %> 
# show a create form to authorized users 
<% end %> 

Это не правильно, разрешающее контроллер. Админы могут видеть условную форму создания, но не имеют права публиковать ее в действии create.

post :create, valid_params 
Failure/Error: { it { expect(flash).to have_content "Successfully created" } 
expected to find text "Successfully created" 
got: "You are not authorized to access this page." 

В одном примере wiki предлагает создать отдельный класс умения для контроллера с пространством имен. https://github.com/CanCanCommunity/cancancan/wiki/Admin-Namespace

Есть ли более простой способ достичь этого? Это приложение использует много контроллеров с именами, я действительно не хочу создавать класс способности для каждого из них.

Есть ли правильный синтаксис для обращения к контроллеру с именами в классе Ability?

can [:create], Namespaces::Unattacheds 
can [:create], :namespaces_unattacheds 
can [:create], namespaces/unattacheds 
???? 
+0

'Пространство имена :: UnattachedsController' класс, а не четкости, я думаю. –

ответ

0

Это звучит, как вы устанавливаете разрешения на модели Namespaces::Unattacheds, что означает ваш контроллер не нужно делать:

authorize_resource class: false 

Ваш контроллер имеет модель. Возможно, он также наследуется от ApplicationController? (Это было бы логично, что нужно сделать.)

Если вы пытаетесь избежать влияния определенных методов контроллера, использовать only/except положения, как описано здесь: https://github.com/CanCanCommunity/cancancan/wiki/Authorizing-controller-actions#choosing-actions

Я не думаю, что глубина пространства имен это проблема, если он совпадает между вашей моделью и вашим контроллером. Вам просто нужно load_and_authorize_resource и правильная форма в ability.rb:

can [:create], Namespaces::Unattacheds 
+0

Спасибо. Существует несколько контроллеров, которые относятся к одной и той же модели - «Пользователи». Но каждый контроллер имеет разные разрешения. Поэтому я не думаю, что для пользователя могут быть определены способности. Мне нужен способ определения разрешений для контроллера. –

+0

Операторы 'can' для всех контроллеров должны быть в одном классе Ability. Он должен описать полный набор доступных операций, основанный на модели, независимо от того, какой контроллер является текущим. Это означает, что вам могут потребоваться такие выражения, как 'can: create, SomeClass if admin?'. Размышление о нем как о контроллере - это анти-шаблон для CanCan. –

+0

Использование CanCan, как бы вы разрешили только администратору утверждать/отклонять пользователя (действие обновления), но только пользователь обновлял свои собственные атрибуты, не отклоняясь от формата контроллера CRUD? –

Смежные вопросы