rails_admin с cancan не перехватывает исключение доступа запрещен для перенаправления

Я использую rails 5, rails_admin, devise и cancancan.

Все работает правильно, но когда доступ запрещен, отображается сообщение об ошибке "У вас нет прав доступа к этой странице".

Я хочу перенаправить на root_path, я искал и обнаружил, что мне нужно написать в app/controllers/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 не перехватывает исключение

1 ответ

Решение

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

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

config.parent_controller = 'ApplicationController' 

Вы также можете добиться этого, расширив контроллер rails_admin. Это исправление обезьяны, но может быть полезно, если вы не хотите устанавливать родительский контроллер наApplicationController по особой причине.

Добавить в config/initializers/rails_admin_cancan.rb файл.

require 'rails_admin/main_controller'

module RailsAdmin

  class MainController < RailsAdmin::ApplicationController
    rescue_from CanCan::AccessDenied do |exception|
      flash[:alert] = 'Access denied.'
      redirect_to main_app.root_path
    end
  end
end
Другие вопросы по тегам