Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce ActionMailer::FormBuilder #48542

Merged
merged 1 commit into from
Sep 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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