Rails is great at generating HTML, so of course ActionMailer can generate HTML. It works almost like generating text messages, but with a few more details. Because some users really prefer text email messages, this demonstration will give them a choice. The form in app/views/awards/show.html.erb used to request the email, previously shown in Example 17-5, will have an extra checkbox. This extra component sets a parameter identifying whether to send “rich text” (really HTML) email, highlighted in Example 17-6. (This code is in ch17/student011.)
Example 17-6. Adding a checkbox for choosing whether to send HTML or text email
<% form_tag email_student_award_path(@student, @award) do %><p><%= check_box_tag :use_html %>
<label for="use_html">Use rich text?</label></p>
<%= submit_tag 'Email me this award' %> <% end %>
The email
method in awards_controller
, previously shown in Example 17-2, grows a little more
complex to support the checkbox’s new :use_html
parameter, as shown in Example 17-7.
Example 17-7. Providing controller support for sending HTML-based email, when desired
def email @award = @student.awards.find(params[:id])if params[:use_html]
AwardMailer.deliver_html_certificate(@award, current_user.email)
else
AwardMailer.deliver_certificate(@award, current_user.email)end
flash[:notice] = "Email has been sent" redirect_to([@student, @award]) end
If the checkbox was checked, the user wants rich text, and so the
controller calls AwardMailer
’s
deliver_html_certificate
method
instead of just deliver_certificate
.
There still isn’t really a deliver_html_certificate
method in the
app/models/award_mailer.rb file
shown in Example 17-8,
but there is a new html_certificate
method that looks almost like the certificate
method from Example 17-3, except that it
has a different name and one new field.
Example 17-8. An html_certificate method specifying headers and sending content
defhtml_certificate
(award, email) subject award.name recipients email from 'School System <[email protected]>' sent_on Time.now body :award => awardcontent_type 'text/html'
end
The new content_type
field is
critical if you want the HTML to be rendered in the recipient’s mail view rather than
show its source. By default, content_type
will be text/plain
, a MIME content type identifier
that tells the mailer to render as text. Setting it to text/html
tells the
mailer to render as HTML. Of course, that means creating a view that
will generate HTML, the /app/views/award_mailer/html_certificate.html.erb
file shown in Example 17-9.
Example 17-9. A view that generates the body of an HTML email message
<table width="100%" border="1" cellpadding="10"> <tr> <td align="center"> <br /> <br /> <h1><%=h @award.name %></h1> <br /> <br /> <p>awarded to</p> <br /> <br /> <h2><%=h @award.student.name %></h2> <br /> <h3><%=h @award.year %></h3 </td> </tr> </table> <br /> <br /> <hr /> <p>Courtesy of the School System!</p>
Now, if users visit an award page, they’ll see a checkbox and button like that shown in Figure 17-5, from which they can send a message like that shown in Figure 17-6.
The HTML email sent will also be recorded in the log.