From 15a665e4c0ece3d2669b7f869953b7b685b94d3b Mon Sep 17 00:00:00 2001 From: Anatoly Shirykalov Date: Thu, 5 Jul 2018 17:43:31 +0300 Subject: [PATCH] code_reload --- lib/rails_admin/config.rb | 8 ++++++++ lib/rails_admin/engine.rb | 8 ++++++++ spec/rails_admin/config_spec.rb | 26 ++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/lib/rails_admin/config.rb b/lib/rails_admin/config.rb index 207fa142e7..0f8ebfb193 100644 --- a/lib/rails_admin/config.rb +++ b/lib/rails_admin/config.rb @@ -304,6 +304,14 @@ def reset_model(model) @registry.delete(key) end + # Reset all models configuration + # Used to clear all configurations when reloading code in development. + # @see RailsAdmin::Engine + # @see RailsAdmin::Config.registry + def reset_all_models + @registry = {} + end + # Get all models that are configured as visible sorted by their weight and label. # # @see RailsAdmin::Config::Hideable diff --git a/lib/rails_admin/engine.rb b/lib/rails_admin/engine.rb index 588e62faff..94dd90ff21 100644 --- a/lib/rails_admin/engine.rb +++ b/lib/rails_admin/engine.rb @@ -28,6 +28,14 @@ class Engine < Rails::Engine app.config.middleware.use Rack::Pjax end + initializer 'RailsAdmin reload config in development' do + unless Rails.application.config.cache_classes + ActiveSupport::Reloader.before_class_unload do |cl| + RailsAdmin::Config.reset_all_models + end + end + end + rake_tasks do Dir[File.join(File.dirname(__FILE__), '../tasks/*.rake')].each { |f| load f } end diff --git a/spec/rails_admin/config_spec.rb b/spec/rails_admin/config_spec.rb index f178601608..1928d1d603 100644 --- a/spec/rails_admin/config_spec.rb +++ b/spec/rails_admin/config_spec.rb @@ -344,6 +344,12 @@ class RecursivelyEmbedsMany end end + let(:team_config3) do + proc do + field :wins + end + end + it "allows code reloading" do Team.send(:rails_admin, &team_config) @@ -364,6 +370,26 @@ class Toggle < RailsAdmin::Config::Fields::Base Team.send(:rails_admin, &team_config2) expect(fields.map(&:name)).to match_array %i(id wins) end + + it "updates model config when reloading code" do + Team.send(:rails_admin, &team_config) + + # this simulates rails code reloading + Rails.application.config.cache_classes = false + RailsAdmin::Engine.initializers.select do |i| + i.name == "RailsAdmin reload config in development" + end.first.block.call + ActiveSupport::Reloader.new.tap do |instance| + instance.class_unload! + end + # /end + + Team.send(:rails_admin, &team_config3) + expect(fields.map(&:name)).to match_array %i(wins) + + # restore setting to previous value + Rails.application.config.cache_classes = true + end end end