rails_admin与cancan无法访问被拒绝的重定向异常

use*_*851 5 devise rails-admin cancancan ruby-on-rails-5

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我做了,但未经授权,我仍然在错误信息中.它没有重定向.

我认为其余代码必须正常,因为它可以工作,但不能重定向到任何地方.

#config/initializers/rails_admin.rb
config.authorize_with :cancan
config.current_user_method(&:current_user)
Run Code Online (Sandbox Code Playgroud)

.

#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
Run Code Online (Sandbox Code Playgroud)

我看到更多人问同样的问题,但所有人都没有答案.我发现一个有3个答案,但我不理解接受的解决方案,因为它实际上没有解释任何解决方案: Cancan +设计rescue_from没有捕获异常

Col*_*ins 10

看起来它ApplicationController实际上并不是RailsAdmin::MainController默认的父级.因此,当RailsAdmin::MainController抛出CanCan::AccessDenied异常时,它实际上从未触及ApplicationController,并且救援块永远不会开始.

您可以在config块中显式声明ApplicationController为父级RailsAdmin::MainControllerrails_admin.rb

config.parent_controller = 'ApplicationController' 
Run Code Online (Sandbox Code Playgroud)


abh*_*7in 5

您还可以通过扩展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
Run Code Online (Sandbox Code Playgroud)