Schermata Red Rails invece del messaggio flash: CanCan::AccessDenied in RailsAdmin::MainController#dashboard

Aug 21 2020

Uso Devise, CanCanCan e rails_admin. Con l'accessibilità va tutto bene, ma non riesco a ricevere un messaggio flash e reindirizzare a root_path e ottenere la schermata qui sotto. Qualche idea, suggerimento su come potrei ricevere un messaggio flash invece di questo? Altri messaggi flash, sia avvisi che notifiche, visualizzano OK. Molte grazie.

Il mio 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

capacità.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, :rails_admin
      cannot :manage, :dashboard
      can :read, :all
    end
  end
end

EDIT: la risposta funzionante è contrassegnata. Inoltre dovrei definire la variabile di stato in questo modo:

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

nel mio Usermodello

Risposte

2 user11350468 Aug 21 2020 at 23:11

Sembra RailsAdmin::MainControllerche non sia derivato da ApplicationController che hai definito sull'app per catturare le eccezioni sollevate nella sua sottoclasse.

È necessario aggiungere in modo esplicito la configurazione per utilizzare un altro controller principale come di seguito. Si prega di trovare la relativa documentazione gemma qui :

 # in config/initializers/rails_admin.rb

config.parent_controller = 'ApplicationController'

Anche questa risposta di overflow dello stack potrebbe aiutarti.