我正在使用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 not catching exception
答案 0 :(得分:10)
默认情况下,ApplicationController
实际上并不是RailsAdmin::MainController
的父级。因此,当RailsAdmin::MainController
抛出CanCan::AccessDenied
例外时,它实际上从未触及ApplicationController
,并且救援块永远不会开始。
您可以使用
在ApplicationController
配置块中明确声明RailsAdmin::MainController
为rails_admin.rb
的父级
config.parent_controller = 'ApplicationController'
答案 1 :(得分:0)
您还可以通过扩展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