Action mailerでlink_toを使う時にやったこと
Action mailerのテンプレートでlink_toを使う時にハマったことメモです。
mailerのテンプレートファイルでlink_toを記述
send_message_to_user.slim
h1 お知らせ
p = link_to event.event_title, event_url(event)
Helperの読み込み
mailerのテンプレートではlink_toをそのまま使うことができないので、mailerでhelperを読み込む。
testmailer.rb
class TestMailer < ApplicationMailer
add_template_helper(ActionView::Helpers::UrlHelper)
default from: 'test@test.com'
def send_message_to_user
#省略
end
end
参考:https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html
development.rbの設定
しかし、このままだとこんなエラーが...
ActionView::Template::Error:
Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
怒られている通り、development.rbにhost情報を設定しなくてはならない
参考:https://qiita.com/saicologic/items/1c692b42ba203bf2d406
development.rb
config.action_mailer.default_url_options = { host: 'localhost:3000' }
今度はうまくいきました!
RSpecでハマる
調子に乗って簡単なRSpecを動かしてみると...
test_mailer_spec.rb
require "rails_helper"
RSpec.describe TestMailer, type: :mailer do
describe "メール送信機能" do
let(:user) { FactoryBot.create(:user) }
let(:mail) { TestMailer.send_message_to_user(user) }
it "正しいメールアドレスから送信すること" do
expect(mail.from).to eq ["test@test.com"]
end
end
end
先ほど乗り越えたはずのエラーが!
ActionView::Template::Error:
Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
確かに記述したはずなのに動かない...としばらくハマってしまいました。
テスト環境でも同様の設定をする必要があった
理由は簡単で、開発環境用のdevelopment.rbだけでなくテスト環境でもhostを指定しなければなりませんでした。
rails_helper.rb
config.action_mailer.default_url_options = { host: 'localhost:3000' }
これで通るようになりました!
テストを書く時には環境ごとの差異に注意しなくてはなりませんね...