Rails3 - CanCan - неинициализированная константа Ability :: Page - PullRequest
4 голосов
/ 12 января 2011

Я только что добавил 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

Вот начало трассировки стека -

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'

Спасибо, Алекс

Ответы [ 2 ]

8 голосов
/ 12 января 2011

Документация CanCan описывает метод can следующим образом:

Метод can используется для определения разрешений и требует двух аргументов.Первый - это действие, для которого вы устанавливаете разрешение, второй - это класс объекта, для которого вы его устанавливаете.

Итак, проблема в том, что у вас нетPage класс в вашей системе для управления доступом CanCan.

Обратите внимание, что CanCan построен как: (выделено мной)

библиотека авторизации для Ruby on Rails, котораяограничивает доступ к ресурсам данному пользователю.

Так что, если вы стремитесь управлять абстрактными концепциями, к которым не прикреплены ресурсы рельсов, вы, вероятно,иметь тяжелые времена с CanCan

6 голосов
/ 03 апреля 2012

Просто примечание для тех, кто нашел это сейчас ...

Вы можете авторизовать любой контроллер без перегрузки, абстрактные классы и методы.

Пример:

/ приложение / модели / 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

Просто помните, что, скорее всего, у вас уже есть авторизация ресурсов из ApplicationController, например, вот так

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

...