Rails3 - Cancan - ненициализированная постоянная способность :: page
-
10-10-2019 - |
Вопрос
Я только что добавил Cancan 1.5.0 в мое приложение Rails 3 Вот мой файл способности -
def initialize(user)
user ||= User.new
if user.role == 'Admin'
can :manage, :all
end
if user.role == 'Standard'
can :manage, Library
can :manage, Page
else
can :manage, Page
can :manage, Library
end
У меня есть пользовательский класс (непревзойденные функции)
class PagesController < ApplicationController
authorize_resource :class => false
def home
end
end
Как вы можете видеть, я использую правильную функцию для непрерывного класса, но я все еще получаю эту ошибку -
uninitialized constant Ability::Page
Вот начало Stacktrace -
app/models/ability.rb:16:in `initialize'
cancan (1.5.0) lib/cancan/controller_additions.rb:327:in `new'
cancan (1.5.0) lib/cancan/controller_additions.rb:327:in `current_ability'
cancan (1.5.0) lib/cancan/controller_additions.rb:308:in `authorize!'
cancan (1.5.0) lib/cancan/controller_resource.rb:40:in `authorize_resource'
cancan (1.5.0) lib/cancan/controller_resource.rb:9:in `block in add_before_filter'
activesupport (3.0.3) lib/active_support/callbacks.rb:436:in ` _run__1386450187816505438__process_action__15559788756486462__callbacks'
activesupport (3.0.3) lib/active_support/callbacks.rb:409:in `_run_process_action_callbacks'
activesupport (3.0.3) lib/active_support/callbacks.rb:93:in `run_callbacks'
Спасибо, Алекс
Решение
В документации Cancan описывается can
Метод как:
А
can
Метод используется для определения разрешений и требует двух аргументов. Первое - это действие, на которое вы устанавливаете разрешение, второй - это класс объекта, на котором вы его настраиваете.
Итак, проблема в том, что у вас нет Page
Класс в вашей системе для Канкана, чтобы управлять доступом.
Обратите внимание, что Cancan создан как: (выделение добавлено мной)
библиотека авторизации для Ruby on Rails, которая ограничивает то, что Ресурсы Данный пользователь разрешается получить доступ.
Поэтому, если вы стремитесь контролировать абстрактные концепции, в которых нет ресурсов Rails, к ним прикреплены ресурсы, у вас, вероятно, будет трудное время с Cancan
Другие советы
Просто примечание для любого, кто находит это сейчас на ...
Вы можете разрешить любого непревзойденного контроллера, абстрактных классов и методов.
Пример:
/app/models/role_ability.rb
class RoleAbility
def initialize(user)
user ||= User.new
if user.role == 'Admin'
can :manage, Post # some existing resource_authorisation
can :do_this, :on_this # authorizing a non resource
end
end
end
: DO_THIS и: ON_THIS полностью произвольны, но они должны соответствовать авторизации! параметры в контроллере, как ...
class Controller < ApplicationController
def some_abstract_method
### Awesome method code goes here
authorize! :do_this, :on_this
end
end
Просто помните, что, скорее всего, у вас, вероятно, уже есть некоторая разрешение на ресурсы, произошедшее из приложения, может быть, так, как это
class ApplicationController
authorize_resource || authorize! :admin, Object || load_and_authorize_resource etc
end
Так что не забудьте skip_authorize_resource в вашем непревзойденном/абстрактном контроллере
class AbstractController < ApplicationController
skip_authorize_resource
def some_abstract_method
authorize! :do_this, :on_this
end
end
Теперь администратор может: do_this,: on_this и будет хорошо разрешено. Вы, вероятно, захотите назвать эту способность немного более семантически, просто хотели подчеркнуть произвольность.
Все это использует Cancan 1.5, ни о чем не пробовал раньше.
Из https://github.com/ryanb/cancan/wiki/non-restful-controllers