Rails:在ActionMailer视图中生成完整的URL

时间:2010-02-13 11:49:51

标签: ruby-on-rails actionmailer host url-for

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

我正在使用:

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

在我看来

B部分:

在开发模式下,如果我没有在上面的链接中指定主机explicilty,则Rails会抱怨。但我不想在制作中这样做。任何解决方案?

5 个答案:

答案 0 :(得分:17)

要解决在ActionMailer中传递主机以生成网址的问题,请查看this pluginreason why I wrote it

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

<%= 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

答案 1 :(得分:12)

我不确定它是否是你想要的,但在config / environments / development.rb中你可以指定邮件网址的默认选项

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

你可以在config / environments / production.rb

中做同样的事情

答案 2 :(得分:6)

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

转到/config/environments并添加:

config.absolute_site_url = 'your site url'

表示相应的环境(即在development.rb,test.rb或production.rb中)。重启Web服务器。

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

答案 3 :(得分:0)

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

请参阅documentation中的使用资源主机部分。您需要指定asset_host。您还可以从请求链"#{request.protocol}#{request.host_with_port}/login/?guid=#{@user.new_user.guid}"

动态构建它

答案 4 :(得分:-1)

要生成网址,请尝试

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

因此,如果链接未过期,您可以立即采取行动