Make reusable action configuration autoload-friendly

Author: CardyardCreated May 6, 2022Updated Oct 23, 2025
Labelsenhancement

Is your feature request related to a problem? Please describe. It took me a while to get autoloading working with Zeitwerk and Rails 7 and Rails Admin 3.0. I've ended up with the opposite of what I had pre: Zeitwerk/Rails 7/Rails Admin 3.0..

  • Any code in a reusable action is not reloaded
  • Any code outside of a reusable action is reloaded

Describe proposed solution(s) Add some comments to... Configuration 2. Actions

These are my proposed comments...

Reloading with Zeitwerk

If you are defining reusable rails_admin actions in zeitwerk mode(the only mode post Rails 6), you can include your library of code in the main autoloader in config/application.rb, but must register your rails_admin actions only once. This can be achieved using the after_initialize block

# config/initializers/rails_admin.rb
# Define asset_source outside the `after_initialize' block so it is run before the gem initializer and avoid getting an error
RailsAdmin.config { |config| config.asset_source = :sprockets } # or :webpacker
Rails.application.config.after_initialize do
  # Require your reusable actions which will have the line RailsAdmin::Config::Actions.register(self) 
  Dir[Rails.root.join('lib', 'rails_admin','config','actions','*.rb')
    ].each do |file|
    require file
  end
  RailsAdmin.config do |config|
       dashboard
      index
      new
      export
      bulk_delete
      show
      edit
      <your actions here>
      delete
      show_in_app
  end
end

Avoid using to_prepare block as an alternative to after_initialze because the to_prepare block will be run again after unloading classes by the autoloader which results in rails_admin actions and models being removed from the router.

Note that require is discouraged as you should allow the autoloader to manage loading your code, and using require will exclude the required file from the autoloader. However, since rails_admin actions can't be reloaded, its fine/preferable to use require. Any code you wish to be reloadable can, of course, be placed in other files.

Source: railsadminteam/rails_admin