Подтвердить что ты не робот

CanCanCan выдает регулярную ошибку Rails для исключения, а не флэш-сообщение, как я указал

Я использую CanCanCan, Devise и Rolify.

Мой ApplicationController выглядит следующим образом:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_filter :new_post

  rescue_from CanCan::AccessDenied do |exception|
    redirect_to root_url, :alert => exception.message
  end

  def new_post
    @post = Post.new
  end  

end

Мой routes.rb выглядит следующим образом:

  authenticate :user, lambda { |u| u.has_role? :admin or :editor } do
    get 'newsroom', to: 'newsroom#index', as: "newsroom"
    get 'newsroom/published', to: 'newsroom#published'
    get 'newsroom/unpublished', to: 'newsroom#unpublished'    
  end

# truncated for brevity
  root to: "posts#index"

Это мой ability.rb, который имеет значение:

elsif user.has_role? :member
    can :read, :all
    cannot :read, :newsroom

Итак, когда я вошел в систему как :member, и я пытаюсь перейти к /newsroom, я получаю эту ошибку:

NameError at /newsroom
uninitialized constant Newsroom

Вместо того, чтобы перенаправляться на root_url с :alert, как я ожидал.

Не уверен, что происходит здесь.

Изменить 1

Для чего это стоит, я получаю только это, когда добавляю это в свой NewsroomController:

authorize_resource
4b9b3361

Ответ 1

Оказывается, проблема была в том, что я разрешил свой контроллер Newsroom, потому что Newsroom был невосстанавливаемым контроллером (т.е. не было модели, связанной с Newsroom.

Мне пришлось добавить это в верхнюю часть моего контроллера:

authorize_resource :class => false

Как указано здесь: https://github.com/CanCanCommunity/cancancan/wiki/Non-RESTful-Controllers#alternative-authorize_resource

Ответ 2

Я не очень разбираюсь в CanCan, но вижу, что вы спасаете от CanCan:: AccessDenied, тогда как исключение - NameError. Таким образом, вы не должны ожидать, что ваш спасательный блок будет работать.

Я бы сказал, что вы, вероятно, где-то написали "Newsroom" или обращаетесь к нему там, где он недоступен.