Always provide a fallback renderer for Action Text

Follow-up to #45144.

This ensures that a renderer is always available for Action Text, even
when `ActionController::Base` was not previously loaded.

Fixes #46113.

As with #45144, this still avoids loading `ActionController::Base`
unnecessarily when rendering mail after Action Text has been loaded.

**Before:**

```
$ bin/rails r 'Benchmark.memory { |x| x.report("load"){ MyBlankMailer.blank_email.body } }'
Calculating -------------------------------------
                load     4.466M memsize (     1.205M retained)
                        29.202k objects (    11.943k retained)
                        50.000  strings (    50.000  retained)
```

**After:**

```
$ bin/rails r 'Benchmark.memory { |x| x.report("load"){ MyBlankMailer.blank_email.body } }'
Calculating -------------------------------------
                load     4.462M memsize (     1.205M retained)
                        29.141k objects (    11.940k retained)
                        50.000  strings (    50.000  retained)
```

Co-authored-by: Christopher Louvet <cl@nonplaces.com>
This commit is contained in:
Jonathan Hefner 2022-09-23 11:59:16 -05:00
parent 0b1b512976
commit 763941e81b
2 changed files with 5 additions and 8 deletions

@ -59,12 +59,6 @@ def to_trix_content_attachment_partial_path
end
initializer "action_text.renderer" do
ActiveSupport.on_load(:action_controller_base) do
ActiveSupport.on_load(:action_text_content) do
self.default_renderer = Class.new(ActionController::Base).renderer
end
end
%i[action_controller_base action_mailer].each do |base|
ActiveSupport.on_load(base) do
around_action do |controller, action|

@ -8,12 +8,15 @@ module Rendering # :nodoc:
extend ActiveSupport::Concern
included do
cattr_accessor :default_renderer, instance_accessor: false
thread_cattr_accessor :renderer, instance_accessor: false
delegate :render, to: :class
end
class_methods do
def action_controller_renderer
@action_controller_renderer ||= Class.new(ActionController::Base).renderer
end
def with_renderer(renderer)
previous_renderer = self.renderer
self.renderer = renderer
@ -23,7 +26,7 @@ def with_renderer(renderer)
end
def render(*args, &block)
(renderer || default_renderer).render_to_string(*args, &block)
(renderer || action_controller_renderer).render_to_string(*args, &block)
end
end
end