module Parameterized
Ruby on Rails 7.0.10
Since v5.2.8.1Provides 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
Namespace
Modules
Extends
Attributes
Used by
Included by (1)
Methods (inherited)
From ActiveSupport::Concern
(3)
- # class_methods
- # included
- # prepended