Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Devise rails_admin,cancan未捕获重定向的拒绝访问异常_Devise_Ruby On Rails 5_Rails Admin_Cancancan - Fatal编程技术网

Devise rails_admin,cancan未捕获重定向的拒绝访问异常

Devise rails_admin,cancan未捕获重定向的拒绝访问异常,devise,ruby-on-rails-5,rails-admin,cancancan,Devise,Ruby On Rails 5,Rails Admin,Cancancan,我正在使用rails 5、rails_admin、Desive和cancancan 一切正常,但当访问被拒绝时,会显示“您无权访问此页面”错误屏幕 我想重定向到根路径,我一直在搜索,我只发现我必须在app/controllers/application\u controller.rb中编写以下代码: class ApplicationController < ActionController::Base rescue_from CanCan::AccessDenied do

我正在使用rails 5、rails_admin、Desive和cancancan

一切正常,但当访问被拒绝时,会显示“您无权访问此页面”错误屏幕

我想重定向到根路径,我一直在搜索,我只发现我必须在app/controllers/application\u controller.rb中编写以下代码:

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

我看到越来越多的人问同样的问题,但他们都没有答案。我找到了一个有3个答案的答案,但我不理解公认的解决方案,因为它确实无法解释任何解决方案:

默认情况下,
ApplicationController
实际上不是
RailsAdmin::MainController
的父级。因此,当
RailsAdmin::MainController
抛出
CanCan::AccessDenied
异常时,它实际上从未触及
ApplicationController
,救援块也从未启动

rails\u admin.rb
config块中,您可以显式地将
ApplicationController
声明为
RailsAdmin::MainController

config.parent_controller = 'ApplicationController' 

您还可以通过扩展rails_admin控制器来实现这一点。这是monkey patching,但如果由于特定原因不想将父控制器设置为
ApplicationController
,则此功能非常有用

将以下内容添加到
config/initializers/rails\u admin\u 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
需要“rails\u admin/main\u controller”
模块RailsAdmin
类MainController
是-也是我的解决方案。使用rails_admin(1.1.1)对我有效,我从0.8.0升级到了2.0.2。这个答案对我也有效。谢谢你这真是妙极了!接受的解决方案为rails admin的仪表板引发了拒绝访问错误,因为没有执行授权。也许bc我在我的应用程序\u控制器中有一个check\u授权,在特定的rails管理资源中有一个no load\u和\u authorize\u资源。尽管如此,你的建议还是奏效了。
config.parent_controller = 'ApplicationController' 
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