Rails3 - Cancan - ненициализированная постоянная способность :: page

StackOverflow https://stackoverflow.com/questions/4671115

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top