红色Rails屏幕,而不是Flash消息:RailsAdmin :: MainController#dashboard中的CanCan :: AccessDenied

问题描述

我使用Devise,CanCanCan和rails_admin。具有可访问性,一切都很好,但是我无法收到Flash消息并重定向到root_path并显示以下屏幕。关于如何获取即时消息的任何想法和提示?其他Flash消息(警报和通知)均显示OK。非常感谢。

Rails server red error screen

我的ApplicationController是:

class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_user!

def after_sign_in_path_for(resource)
  stored_location_for(resource) || welcome_path_url
end

rescue_from CanCan::AccessDenied do |exception|
  respond_to do |format|
    format.json { head :forbidden,content_type: 'text/html' }
    format.html { redirect_to main_app.root_url,notice: exception.message }
    format.js   { head :forbidden,content_type: 'text/html' }
  end
end
end

rails_admin.rb

RailsAdmin.config do |config|

### Popular gems integration

## == Devise ==
config.authenticate_with do
  warden.authenticate! scope: :user
end
config.current_user_method(&:current_user)

## == CancanCan ==
# config.authorize_with :cancancan
config.authorize_with do
  redirect_to main_app.root_path unless current_user.superuser ==true
end
<....>
end

ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    # Define abilities for the passed in user here. For example:
    #
    user ||= User.new # guest user (not logged in)
    if user.superuser?
      can :manage,:all
      cannot :access,:rails_admin
      cannot :manage,:dashboard
    end
    if user.office?
      cannot :access,:dashboard
      can :read,:all
    end
  end
end

编辑: 工作答案已标记。 我也应该这样定义状态变量:

  def status
    @user_role ||= User.new(read_attribute(:user_role))
  end

在我的User模型中。

解决方法

似乎RailsAdmin::MainController不是从您在应用程序上定义的ApplicationController派生的,以捕获其子类上引发的异常。

您需要显式添加配置以使用另一个父控制器,如下所示。请找到相关的gem文档here

 # in config/initializers/rails_admin.rb

config.parent_controller = 'ApplicationController'

This堆栈溢出答案也可能会对您有所帮助。