LoginSignup
2
0

More than 3 years have passed since last update.

Rails6 のちょい足しな新機能を試す61(ActionMailer template_name編)

Posted at

はじめに

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 を修正して、メール送信処理を呼び出すようにします。

app/controllers/users_controller.rb
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' を追加します。

app/mailers/user_mailer.rb
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.erbcreated_email.text.erb になりますが、
今回は、 テンプレートのファイル名を template.html.erbtemplate.text.erb にします。
メールで使われたテンプレートのファイル名と登録されたユーザーを表示するようにします。

HTML のテンプレートです。

app/views/user_mailer/template.html.erb
<p>
  this is <%= File.basename(__FILE__) %>
</p>
<p>
  User:<%= @user.name %> is created
</p>

テキストのテンプレートも作っておきます。

app/views/user_mailer/template.text.erb
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

参考情報

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0