On extending the
You may sometimes want to add functionality to Avo's
ApplicationController. That functionality may be setting attributes to
Current or multi-tenancy scenarios.
When you need to do that, you may feel the need to override it with your own version. That means you go into the source code, find
AVO_REPO/app/controllers/avo/application_controller.rb, copy the whole thing into your own
YOUR_APP/app/controllers/avo/application_controller.rb file inside your app, and add your own piece of functionality.
# Copied from Avo to `app/controllers/avo/application_controller.rb` module Avo class ApplicationController < ::ActionController::Base include Pagy::Backend include Avo::ApplicationHelper include Avo::UrlHelpers protect_from_forgery with: :exception around_action :set_avo_locale before_action :multitenancy_detector # ... more Avo::ApplicationController methods def multitenancy_detector # your logic here end end end
That will work just fine until the next time we update it. After that, we might add a method, remove one, change the before/after actions, update the helpers and do much more to it. That will definitely break your app the next time when you upgrade Avo. Avo's private controllers are still considered private APIs that may change at any point. These changes will not appear in the changelog or the upgrade guide.
Responsibly extending the
There is a right way of approaching this scenario using Ruby modules or concerns.
First, you create a concern with your business logic; then you include it in the parent
Avo::ApplicationController like so:
# app/controllers/concerns/multitenancy.rb module Multitenancy extend ActiveSupport::Concern included do before_action :multitenancy_detector end def multitenancy_detector # your logic here end end # configuration/initializers/avo.rb Rails.configuration.to_prepare do Avo::ApplicationController.include Multitenancy end
With this technique, the
multitenancy_detector method and its
before_action will be included safely in