lib/rails_admin/engine.rb
# frozen_string_literal: true
require 'kaminari'
require 'nested_form'
require 'rails'
require 'rails_admin'
require 'rails_admin/version'
require 'turbo-rails'
module RailsAdmin
class Engine < Rails::Engine
isolate_namespace RailsAdmin
attr_accessor :importmap
config.action_dispatch.rescue_responses['RailsAdmin::ActionNotAllowed'] = :forbidden
initializer 'RailsAdmin reload config in development' do |app|
config.initializer_path = app.root.join('config/initializers/rails_admin.rb')
unless Rails.application.config.cache_classes
ActiveSupport::Reloader.before_class_unload do
RailsAdmin::Config.reload!
end
reloader = app.config.file_watcher.new([config.initializer_path], []) do
# Do nothing, ActiveSupport::Reloader will trigger class_unload! anyway
end
app.reloaders << reloader
app.reloader.to_run do
reloader.execute_if_updated { require_unload_lock! }
end
reloader.execute
end
end
initializer 'RailsAdmin precompile hook', group: :all do |app|
case RailsAdmin.config.asset_source
when :sprockets
app.config.assets.precompile += %w[
rails_admin/application.js
rails_admin/application.css
]
app.config.assets.paths << RailsAdmin::Engine.root.join('src')
require 'rails_admin/support/es_module_processor'
Sprockets.register_bundle_processor 'application/javascript', RailsAdmin::Support::ESModuleProcessor
when :importmap
self.importmap = Importmap::Map.new.draw(app.root.join('config/importmap.rails_admin.rb'))
end
end
# Check for required middlewares, users may forget to use them in Rails API mode
config.after_initialize do |app|
has_session_store = app.config.middleware.to_a.any? do |m|
m.klass.try(:<=, ActionDispatch::Session::AbstractStore) ||
m.klass.try(:<=, ActionDispatch::Session::AbstractSecureStore) ||
m.klass.name =~ /^ActionDispatch::Session::/
end
loaded = app.config.middleware.to_a.map(&:name)
required = %w[ActionDispatch::Cookies ActionDispatch::Flash Rack::MethodOverride]
missing = required - loaded
unless missing.empty? && has_session_store
configs = missing.map { |m| "config.middleware.use #{m}" }
configs << "config.middleware.use #{app.config.session_store.try(:name) || 'ActionDispatch::Session::CookieStore'}, #{app.config.session_options}" unless has_session_store
raise <<~ERROR
Required middlewares for RailsAdmin are not added
To fix this, add
#{configs.join("\n ")}
to config/application.rb.
ERROR
end
RailsAdmin::Version.warn_with_js_version
end
end
end