web-dev-qa-db-ja.com

Rails ActionMailerのホスト名を設定するにはどうすればよいですか?

私はかなり伝統的なパスワードを忘れた電子メールに取り組んでいます-ユーザーがパスワードを変更するためにクリックできるリンクに埋め込まれたパスワード変更トークンをユーザーに電子メールで送信したいと思います。従来の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ホスト名が何であるかを伝えるための設定オプションがありますか?

20
edebill

default_url_optionsconfig.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...')
36
Keith Platfoot

ところで、:protocol => 'https'も設定することをお勧めします。

config.action_mailer.default_url_options = { 
    :Host => "portal.example.com", 
    :protocol => 'https' 
}
26
mcr

http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/ で説明されているように、別の代替手段があります。

このソリューションには、構成を必要としない(面倒が少ない)という利点があり、コントローラー内から電子メールを送信する限り正常に機能します。

ただし、コントローラーを経由せずに(コマンドラインから、または別の電子メールに応答して)電子メールを送信する場合は、静的構成が必要です。

4
Michael Reinsch

興味深いことに、私はあなたと同じ問題を抱えていましたが、ユニットテストでした(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' }
0
Zhenya

設定default_url_options直接はRails 3.1で非推奨です。代わりに rl_for を使用してください。

パラメータを追加します:protocolデフォルト値(http)を上書きするには、:protocol => 'https://'。これにより、デフォルトの「http://」ではなく「https:// ...」で始まるURLが作成されます。

0
Sameer