私はかなり伝統的なパスワードを忘れた電子メールに取り組んでいます-ユーザーがパスワードを変更するためにクリックできるリンクに埋め込まれたパスワード変更トークンをユーザーに電子メールで送信したいと思います。従来のActionMailer経由でメールを送信しています。
通常のlink_toタグを使用する場合
<%= link_to "click here", :controller => foo, :action => 'bar', :token => token %>
私は相対的なリンクを取得します-電子メールからはかなり役に立たないです。
追加した場合
:only_path => false
の場合、default_url_options[:Host]
を設定する必要があるというエラーが表示されます。 ActionControllerのドキュメントは、コントローラーの#default_url_optionsメソッドをオーバーライドすることでこれを行うことを示唆しています。確かに、自分の設定ファイルを追加したり、解析したりせずに、Railsホスト名が何であるかを伝えるための設定オプションがありますか?
default_url_options
はconfig.action_mailer
から入手でき、環境の構成ファイルで設定する必要があります。
たとえば、config/environments/production.rb
:
config.action_mailer.default_url_options = {
:Host => 'www.yourdomain.com'
}
ローカルテストの場合は、config/environments/development.rb
を変更します。
config.action_mailer.default_url_options = {
:Host => '127.0.0.1',
:port => 3000
}
次に、forgot_password_login
という名前のルートがあるとすると、次のようなものを使用して、メーラーにログインリンクURLを生成できます。
forgot_password_login_url(:token => 'a7s8q15sk2...')
ところで、:protocol => 'https'も設定することをお勧めします。
config.action_mailer.default_url_options = {
:Host => "portal.example.com",
:protocol => 'https'
}
http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/ で説明されているように、別の代替手段があります。
このソリューションには、構成を必要としない(面倒が少ない)という利点があり、コントローラー内から電子メールを送信する限り正常に機能します。
ただし、コントローラーを経由せずに(コマンドラインから、または別の電子メールに応答して)電子メールを送信する場合は、静的構成が必要です。
興味深いことに、私はあなたと同じ問題を抱えていましたが、ユニットテストでした(Michael Hartlのrailstutorialをフォローしている間)。 test.rbファイルにこの行がありましたが、役に立ちませんでした。
config.action_mailer.default_url_options = { Host: 'example.com', protocol: 'http' }
Test.rbにこのような別の行も追加しましたが、驚くべきことにこれで問題が解決しました
default_url_options = { Host: 'example.com', protocol: 'http' }
設定default_url_options
直接はRails 3.1で非推奨です。代わりに rl_for を使用してください。
パラメータを追加します:protocol
デフォルト値(http)を上書きするには、:protocol => 'https://'
。これにより、デフォルトの「http://」ではなく「https:// ...」で始まるURLが作成されます。