Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
のエラーが出てきたのでメモ。
Document翻訳
元のDocument(http://api.rubyonrails.org/classes/ActionMailer/Base.html )から以下引用
URLs can be generated in mailer views using url_for or named routes. Unlike controllers from Action Pack, the mailer instance doesn't have any context about the incoming request, so you'll need to provide all of the details needed to generate a URL.
(訳:mailerのviewでurl_forやルートを使ってurlを生成することができるけど、普通のコントローラと違って、メーラークラスに送られてくるリクエストには何もコンテキストを持っていない(つまりどのアクションとか、コントローラがそのリクエストを送っているか、とかもっと言えばホスト名とか!)ので、自分でその情報をmailerのviewに教えてあげないといけないよ!)
説明
ローカルの設定ファイルに
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
とおまじないのように書いていたと思いますが、
それは、deviseがpasswordの再設定のときなどに送るメールのviewにおいて「なんちゃら_url」とurlを取得するメソッドを使っていて、
しかしながら、
「なんちゃら_url」= users/newなどのホスト名なしのurl
を生成するだけ&Mailerに来るリクエストはホスト名を保持していないので、
hostを指定する必要があったということです。
[結構重要な情報かも?] 余談 (何故私がはまったか)
-
mailを送るところはほぼ全て自分で(deviseを使わずに)Mailerを実装しており、Mailerのviewで「_url」を使うのではなく、(host名などの情報を持っている)コントローラ・モデルでurlを生成してから、viewに渡すということをしていたので、host名を指定していなくても、正しいurlが生成されていた。
-
passwordを再設定する箇所はdeviseのデフォルトのまま使おうとしたら、deviseのviewにおいて「_url」を使用していたので、エラーが出た
-
つまり本記事タイトルは「Deviseを使うときに書いていた〜」ですが、(action_mailerのconfigなので当たり前と言えば当たり前なのですが)、本当は「ActionMailerのviewで、_urlメソッドなど、host名が必要なときに書いていた〜」が正しいです。