From 5bd980564a565906a6fda87d2ef31590d3e3b0a5 Mon Sep 17 00:00:00 2001 From: "M.Shibuya" Date: Sun, 17 Oct 2021 19:16:36 +0900 Subject: [PATCH] Fix config.parent_controller to work after the class loading Fixes #2790, Refs. e4ae669 --- .rubocop.yml | 2 +- lib/rails_admin/config.rb | 10 +++++++++- spec/rails_admin/config_spec.rb | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 47be7d15f8..eee69e98c7 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -108,7 +108,7 @@ Metrics/MethodLength: Max: 29 # TODO: Lower to 15 Metrics/ModuleLength: - Max: 200 # TODO: Lower to 100 + Max: 202 # TODO: Lower to 100 Metrics/ParameterLists: Max: 8 # TODO: Lower to 4 diff --git a/lib/rails_admin/config.rb b/lib/rails_admin/config.rb index 53efe0e222..46acf21c69 100644 --- a/lib/rails_admin/config.rb +++ b/lib/rails_admin/config.rb @@ -67,7 +67,7 @@ class << self attr_accessor :sidescroll # set parent controller - attr_accessor :parent_controller + attr_reader :parent_controller # set settings for `protect_from_forgery` method # By default, it raises exception upon invalid CSRF tokens @@ -270,6 +270,14 @@ def default_hidden_fields=(fields) end end + def parent_controller=(name) + @parent_controller = name + if defined?(RailsAdmin::ApplicationController) + RailsAdmin.send(:remove_const, :ApplicationController) + load RailsAdmin::Engine.root.join('app/controllers/rails_admin/application_controller.rb') + end + end + # Returns action configuration object def actions(&block) RailsAdmin::Config::Actions.instance_eval(&block) if block diff --git a/spec/rails_admin/config_spec.rb b/spec/rails_admin/config_spec.rb index 4294f62e07..637f38932a 100644 --- a/spec/rails_admin/config_spec.rb +++ b/spec/rails_admin/config_spec.rb @@ -262,6 +262,10 @@ class RecursivelyEmbedsMany end describe '.parent_controller' do + before do + class TestController < ActionController::Base; end + end + it 'uses default class' do expect(RailsAdmin.config.parent_controller).to eq '::ActionController::Base' end @@ -274,6 +278,21 @@ class RecursivelyEmbedsMany end end + describe '.parent_controller=' do + context 'if RailsAdmin::ApplicationController is already loaded' do + after do + RailsAdmin::Config.reset + RailsAdmin.send(:remove_const, :ApplicationController) + load RailsAdmin::Engine.root.join('app/controllers/rails_admin/application_controller.rb') + end + + it 'can be changed' do + RailsAdmin.config.parent_controller = 'ApplicationController' + expect(RailsAdmin::ApplicationController.superclass).to eq ApplicationController + end + end + end + describe '.forgery_protection_settings' do it 'uses with: :exception by default' do expect(RailsAdmin.config.forgery_protection_settings).to eq(with: :exception)