質問

私は、かなり伝統的なパスワードを忘れた場合の電子メールに取り組んでいます。ユーザーがパスワードを変更するためにクリックできるリンクに埋め込まれたパスワード変更トークンを電子メールで送信したいと考えています。従来の 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_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...')

他のヒント

あなたはおそらく設定したい:プロトコル=> '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://"

:これは、 "// ... HTTPS" で始まるURLを作成します。

興味深いことに、私はあなたがやったのと同じ問題を持っていましたが、ユニットテストでは(マイケル・ハートルの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 -%>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top