20

我正在处理一个相当传统的忘记密码电子邮件 - 我想通过电子邮件向用户发送一个嵌入在链接中的密码更改令牌,他们可以单击该链接来更改密码。我通过传统的 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 它的主机名是什么,而无需添加我自己的配置文件、解析它等?

4

7 回答 7

37

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...')
于 2009-04-28T18:58:45.207 回答
26

顺便说一句,您可能还想设置 :protocol => 'https' 。

config.action_mailer.default_url_options = { 
    :host => "portal.example.com", 
    :protocol => 'https' 
}
于 2011-03-14T19:20:57.157 回答
4

还有另一种选择,如http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/中所述

这个解决方案的优点是它不需要任何配置(所以麻烦少),只要您从控制器内发送电子邮件就可以正常工作。

但是,如果您计划在不通过控制器的情况下发送电子邮件(例如,从命令行或响应另一封电子邮件),则需要静态配置。

于 2010-04-22T10:45:35.027 回答
0

default_url_options在 Rails 3.1 中不推荐直接设置。请改用url_for

添加参数:protocol以覆盖默认值 (http) :protocol => 'https://',. 这将创建以“https://...”开头的 url,而不是默认的“http://”

于 2012-09-06T07:34:27.087 回答
0

有趣的是,我遇到了与您相同的问题,但在单元测试中(同时遵循 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' }
于 2017-02-26T15:28:28.680 回答
-1

在 Rails 3.1 中不推荐直接设置 default_url_options

使用 url_for 助手创建它:

<%= link_to "click here", url_for(:controller => foo, :action => 'bar', :token => token, :host => 'www.yourdomain.com') %>
于 2012-01-19T17:36:22.767 回答
-2

你能做到吗

<%="click here", :controller => foo, :action => 'bar', :token => token, :host=>request.host -%>
于 2009-04-28T18:00:07.653 回答