Place configuration options at their proper scope within the framework hierarchy. Avoid tight coupling between components and ensure user configurations aren’t accidentally overridden.
When working with configurations:
Avoid direct framework references in components
Instead of accessing global constants directly:
def perform(event)
ex = event.payload[:exception_object]
if ex
cleaned_backtrace = Rails.backtrace_cleaner.clean(ex.backtrace)
# ...
end
end
Pass dependencies through proper configuration channels:
# In the railtie
initializer "active_job.backtrace_cleaner" do
ActiveJob::LogSubscriber.backtrace_cleaner = Rails.backtrace_cleaner
end
# In the component
def perform(event)
ex = event.payload[:exception_object]
if ex
cleaned_backtrace = self.class.backtrace_cleaner.clean(ex.backtrace)
# ...
end
end
Respect user configuration
Check if user has already set a configuration before applying defaults:
# Bad: Overwrites user configuration
initializer "active_record.attributes_for_inspect" do |app|
ActiveRecord::Base.attributes_for_inspect = :all if app.config.consider_all_requests_local
end
# Good: Respects user configuration
initializer "active_record.attributes_for_inspect" do |app|
if app.config.consider_all_requests_local && app.config.active_record.attributes_for_inspect.nil?
ActiveRecord::Base.attributes_for_inspect = :all
end
end
Avoid mutating shared configuration objects
Always duplicate default configuration objects before modification:
# Bad: Mutates shared constant
route_set_config = DEFAULT_CONFIG
route_set_config[:some_setting] = value
# Good: Works with a copy
route_set_config = DEFAULT_CONFIG.dup
route_set_config[:some_setting] = value
Use environment-specific configuration via config, not conditionals
Instead of hardcoding environment checks:
# Bad: Direct environment checking in middleware
if (Rails.env.development? || Rails.env.test?) && logger(request)
# ...
end
Make behavior configurable:
# Good: Configurable behavior
def initialize(app, warn_on_no_content_security_policy = false)
@app = app
@warn_on_no_content_security_policy = warn_on_no_content_security_policy
end
# Later in code
if @warn_on_no_content_security_policy && logger(request)
# ...
end
Following these practices ensures components remain properly isolated and configurations behave predictably across different environments and application setups.
Enter the URL of a public GitHub repository