Rails ActionMailer のホスト名を設定するにはどうすればよいですか?
-
18-09-2019 - |
質問
私は、かなり伝統的なパスワードを忘れた場合の電子メールに取り組んでいます。ユーザーがパスワードを変更するためにクリックできるリンクに埋め込まれたパスワード変更トークンを電子メールで送信したいと考えています。従来の 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...')
他のヒント
あなたはおそらく設定したい:プロトコル=> '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/
このソリューションには、構成を必要としない (つまり面倒が少ない) という利点があり、コントローラー内から電子メールを送信する限り正常に動作します。
ただし、コントローラーを経由せずに電子メールを送信する予定がある場合 (例:コマンドラインから、または別の電子メールへの応答で)、静的な構成が必要です。
設定default_url_options
は直接のRails 3.1で廃止されました。代わりになurl_for に使用します。
デフォルト値(HTTP)、:protocol
をオーバーライドするパラメータ:protocol => 'https://'
を追加します。代わりにデフォルトの "のhttp://"
興味深いことに、私はあなたがやったのと同じ問題を持っていましたが、ユニットテストでは(マイケル・ハートルの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で廃止されました。
それを作成するためになurl_forヘルパーを使用します:
<%= link_to "click here", url_for(:controller => foo, :action => 'bar', :token => token, :host => 'www.yourdomain.com') %>
あなただけ行うことができます。
<%="click here", :controller => foo, :action => 'bar', :token => token, :host=>request.host -%>