Skip to content

Commit

Permalink
Merge pull request #48542 from ghiculescu/am-default-form-builder
Browse files Browse the repository at this point in the history
Introduce `ActionMailer::FormBuilder`
  • Loading branch information
rafaelfranca committed Sep 25, 2023
2 parents 4c72cc2 + 9a2cf33 commit 38ce7fa
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 0 deletions.
8 changes: 8 additions & 0 deletions actionmailer/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
* Introduce `ActionMailer::FormBuilder`

Use the `default_form_builder` method in mailers to set the default form builder
for templates rendered by that mailer. Matches the behaviour in Action Controller.

*Alex Ghiculescu*


## Rails 7.1.0.beta1 (September 13, 2023) ##

* Mailers are listed in alphabetical order on the mailer preview page now.
Expand Down
1 change: 1 addition & 0 deletions actionmailer/lib/action_mailer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ module ActionMailer
autoload :MessageDelivery
autoload :MailDeliveryJob
autoload :QueuedDelivery
autoload :FormBuilder

def self.eager_load!
super
Expand Down
1 change: 1 addition & 0 deletions actionmailer/lib/action_mailer/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,7 @@ class Base < AbstractController::Base
include Rescuable
include Parameterized
include Previews
include FormBuilder

abstract!

Expand Down
37 changes: 37 additions & 0 deletions actionmailer/lib/action_mailer/form_builder.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# frozen_string_literal: true

module ActionMailer
# = Action Mailer Form Builder
#
# Override the default form builder for all views rendered by this
# mailer and any of its descendants. Accepts a subclass of
# ActionView::Helpers::FormBuilder.
#
# While emails typically will not include forms, this can be used
# by views that are shared between controllers and mailers.
#
# For more information, see +ActionController::FormBuilder+.
module FormBuilder
extend ActiveSupport::Concern

included do
class_attribute :_default_form_builder, instance_accessor: false
end

module ClassMethods
# Set the form builder to be used as the default for all forms
# in the views rendered by this mailer and its subclasses.
#
# ==== Parameters
# * <tt>builder</tt> - Default form builder, an instance of ActionView::Helpers::FormBuilder
def default_form_builder(builder)
self._default_form_builder = builder
end
end

# Default form builder for the mailer
def default_form_builder
self.class._default_form_builder
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<%= form_with(url: "/") do |f| %>
<%= f.message %>
<% end %>
11 changes: 11 additions & 0 deletions actionmailer/test/form_builder_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# frozen_string_literal: true

require "abstract_unit"
require "mailers/form_builder_mailer"

class MailerFormBuilderTest < ActiveSupport::TestCase
def test_default_form_builder_assigned
email = FormBuilderMailer.welcome
assert_includes(email.body.encoded, "hi from SpecializedFormBuilder")
end
end
15 changes: 15 additions & 0 deletions actionmailer/test/mailers/form_builder_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# frozen_string_literal: true

class FormBuilderMailer < ActionMailer::Base
class SpecializedFormBuilder < ActionView::Helpers::FormBuilder
def message
"hi from SpecializedFormBuilder"
end
end

default_form_builder SpecializedFormBuilder

def welcome
mail(to: "email@example.com")
end
end

0 comments on commit 38ce7fa

Please sign in to comment.