2016-11-02 2 views
3

Я использую рельсы 5, rails_admin, devise и cancancan.rails_admin с cancan not catching access denied exception for redirect

Все работает правильно, но когда есть доступ к нему, он показывает экран ошибки «Вы не авторизованы для доступа к этой странице».

Я хочу, чтобы перенаправить на root_path, я искал, и я только обнаружил, что я должен написать в приложение/контроллеры/application_controller.rb этот код:

class ApplicationController < ActionController::Base  
    rescue_from CanCan::AccessDenied do |exception| 
     redirect_to root_path, :alert => exception.message 
    end 
end 

И я сделал, но я все еще в сообщении об ошибке, если оно не разрешено. Он не перенаправляется.

Я думаю, что остальная часть кода должна быть в порядке, потому что она работает, но не перенаправляется в любом месте.

#config/initializers/rails_admin.rb 
config.authorize_with :cancan 
config.current_user_method(&:current_user) 

.

#app/models/ability.rb 
class Ability 
    include CanCan::Ability 

    def initialize(user) 

    user ||= User.new # guest user (not logged in) 
    if user.admin 
     can :access, :rails_admin  # only allow admin users to access Rails Admin 
     can :dashboard   
     can :manage, :all 
    else 
     can :read, :all     # allow everyone to read everything 
    end 
    end 
end 

Я видел больше людей, спрашивающих то же самое, но все они без ответов. Я нашел один с 3-х ответов, но я не понимаю, принятое решение, потому что это на самом деле не объяснить любое решение: Cancan + Devise rescue_from not catching exception

ответ

8

Похоже ApplicationController не является на самом деле родитель RailsAdmin::MainController по умолчанию. Так что, когда RailsAdmin::MainController бросает CanCan::AccessDenied исключение, он фактически никогда не трогает ApplicationController и спасательный блок никогда не умирает.

Вы можете явно объявить ApplicationController в качестве родителя для RailsAdmin::MainController в блоке rails_admin.rb конфигурации с

config.parent_controller = 'ApplicationController' 
+0

Да , оно работает. Спасибо – user6945851

+0

Да - также решение для моего. Использование rails_admin (1.1.1) –