はじめに
Rails 6 に追加されそうな新機能を試す第61段。 今回は、 ActionMailer template_name
編です。
Rails 6 では、 mail
メソッドに :template_name
オプションを指定することで、メールのテンプレートファイルを変更することができるようになりました。
Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease
でインストールできます。
$ rails --version
Rails 6.0.0.rc1
User 登録時にメールを送信するようにします。
プロジェクトを作る
rails new rails6_0_0rc1
cd rails6_0_0rc1
User の CRUD を作る
User の CRUD を scaffold で作ります。
$ bin/rails g scaffold User name
UserMailer を作る
$ bin/rails g mailer User
Controller を修正する
UsersConteroller#create
を修正して、メール送信処理を呼び出すようにします。
class UsersController < ApplicationController
...
def create
...
respond_to do |format|
if @user.save
UserMailer.with(user: @user).created_email.deliver_later # この行を追加する
...
end
UserMailer にアクションを追加する
UserMailer にアクション(メソッド) created_email
を追加します。
今回の機能を確認するため、 mail
メソッドの引数に template_name: 'template'
を追加します。
class UserMailer < ApplicationMailer
def created_email
@user = params[:user]
mail(to: 'admin@example.com', subject: 'user created', template_name: 'template') do |format|
format.text
format.html
end
end
end
メールのテンプレートを作る
普通だったら、 テンプレートのファイル名は、 created_email.html.erb
と created_email.text.erb
になりますが、
今回は、 テンプレートのファイル名を template.html.erb
と template.text.erb
にします。
メールで使われたテンプレートのファイル名と登録されたユーザーを表示するようにします。
HTML のテンプレートです。
<p>
this is <%= File.basename(__FILE__) %>
</p>
<p>
User:<%= @user.name %> is created
</p>
テキストのテンプレートも作っておきます。
this is <%= File.basename(__FILE__) %>
<%= @user.name %> is created
rails server を実行する
$ bin/rails s
ブラウザで確認する
http://localhost:3000/users/new にアクセスしてユーザーを登録してみます。
ログにメールの内容が出力されています。
----==_mimepart_5d325e19e1215_1342ab3fd7ac1d813972
Content-Type: text/plain;
charset=UTF-8
Content-Transfer-Encoding: 7bit
this is template.text.erb
Taro is created
----==_mimepart_5d325e19e1215_1342ab3fd7ac1d813972
Content-Type: text/html;
charset=UTF-8
Content-Transfer-Encoding: 7bit
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
/* Email styles need to be inline */
</style>
</head>
<body>
<p>
this is template.html.erb
</p>
<p>
User:Taro is created
</p>
</body>
</html>
----==_mimepart_5d325e19e1215_1342ab3fd7ac1d813972--
:template_name
を省略した場合
:template_name
を省略した場合は、アクション名(メソッド名) がそのまま、メールのテンプレート名として使われます。
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try061_mail_multi_part_template