17

我正在使用 ActionMailer 发送注册确认电子邮件。电子邮件需要包含返回站点的链接以验证用户,但我无法说服 Rails 生成完整的 URL(包括域等)。

我正在使用:

<%= url_for :controller => 'login', :action => 'verify', :guid => @user.new_user.guid, :only_path => false, :host => 'http://plantality.com' %>

在我看来

b部分:

在开发模式下,如果我没有在上面的链接中指定主机明确性,Rails 就会抱怨。但我不想在生产中这样做。有什么解决办法吗?

4

5 回答 5

17

要解决在 ActionMailer 中传递用于生成 URL 的主机的问题,请查看此插件以及我编写它的原因

要解决第一个问题,请在适用时使用命名路由。代替

<%= url_for :controller => 'login', :action => 'verify', :guid => @user.new_user.guid, :only_path => false, :host => 'http://plantality.com' %>

假设路由被调用login,使用

<%= login_url(:guid => @user.new_user.guid) %>

请注意,我使用的是login_url,而不是login_path

于 2010-02-13T13:07:23.117 回答
12

我不确定这是否是您想要的,但在 config/environments/development.rb 您可以为邮件程序 url 指定默认选项

config.action_mailer.default_url_options = {
  :host => "your.host.org",
  :port => 3000
}

你可以在 config/environments/production.rb 中做同样的事情

于 2010-02-13T12:11:12.653 回答
6

我不知道为什么以前的解决方案看起来如此复杂,但既然我在这里,为什么不给我的 2 美分......

转到/config/environments并添加:

config.absolute_site_url = 'your site url'

针对各自的环境(即在 development.rb、test.rb 或 production.rb 中)。重启网络服务器。

这允许您调用Rails.application.config.absolute_site_url以获取所需的 URL。不需要插件或奇怪的作弊,只需将站点 url 存储为应用程序范围的变量。

于 2014-12-31T07:41:16.827 回答
1

我认为它不是 100% 正确的方法,但这也可以是一个解决方案:

请参阅文档中的使用资产主机部分。您需要指定一个. 您还可以从请求链中动态构建它asset_host"#{request.protocol}#{request.host_with_port}/login/?guid=#{@user.new_user.guid}"

于 2012-12-06T12:16:18.747 回答
-1

要生成 url,试试这个

Rails.application.routes.url_helpers.user_url(User.first.id, host: 'yourhost.io')

这将生成这样的网址:

http://yourhost.io/users/1

你也可以传递一些参数

expires = Time.now + 2.days
params = {expires: expires}
u = User.first.id

Rails.application.routes.url_helpers.user_url(u, params, host: 'host.com')

将产生:

http://yourhost.io/users/1.expires=2018-08-12+15%253A52%253A15+%252B0300

因此,如果链接未过期,您可以进行操作

于 2018-08-10T13:02:13.137 回答