module
ActionMailer::Parameterized
v7.2.3 -
Show latest stable
Action Mailer Parameterized
Provides the option to parameterize mailers in order to share instance variable setup, processing, and common headers.
Consider this example that does not use parameterization:
class InvitationsMailer < ApplicationMailer def account_invitation(inviter, invitee) @account = inviter.account @inviter = inviter @invitee = invitee subject = "#{@inviter.name} invited you to their Basecamp (#{@account.name})" mail \ subject: subject, to: invitee.email_address, from: common_address(inviter), reply_to: inviter.email_address_with_name end def project_invitation(project, inviter, invitee) @account = inviter.account @project = project @inviter = inviter @invitee = invitee @summarizer = ProjectInvitationSummarizer.new(@project.bucket) subject = "#{@inviter.name.familiar} added you to a project in Basecamp (#{@account.name})" mail \ subject: subject, to: invitee.email_address, from: common_address(inviter), reply_to: inviter.email_address_with_name end def bulk_project_invitation(projects, inviter, invitee) @account = inviter.account @projects = projects.sort_by(&:name) @inviter = inviter @invitee = invitee subject = "#{@inviter.name.familiar} added you to some new stuff in Basecamp (#{@account.name})" mail \ subject: subject, to: invitee.email_address, from: common_address(inviter), reply_to: inviter.email_address_with_name end end InvitationsMailer.account_invitation(person_a, person_b).deliver_later
Using parameterized mailers, this can be rewritten as:
class InvitationsMailer < ApplicationMailer before_action { @inviter, @invitee = params[:inviter], params[:invitee] } before_action { @account = params[:inviter].account } default to: -> { @invitee.email_address }, from: -> { common_address(@inviter) }, reply_to: -> { @inviter.email_address_with_name } def account_invitation mail subject: "#{@inviter.name} invited you to their Basecamp (#{@account.name})" end def project_invitation @project = params[:project] @summarizer = ProjectInvitationSummarizer.new(@project.bucket) mail subject: "#{@inviter.name.familiar} added you to a project in Basecamp (#{@account.name})" end def bulk_project_invitation @projects = params[:projects].sort_by(&:name) mail subject: "#{@inviter.name.familiar} added you to some new stuff in Basecamp (#{@account.name})" end end InvitationsMailer.with(inviter: person_a, invitee: person_b).account_invitation.deliver_later
Files
- actionmailer/lib/action_mailer/parameterized.rb