我正在使用ActionMailer发送注册确认电子邮件。电子邮件需要包含返回网站的链接以验证用户,但我无法说服Rails生成完整的URL(包括域等)。
我正在使用:
<%= url_for :controller => 'login', :action => 'verify', :guid => @user.new_user.guid, :only_path => false, :host => 'http://plantality.com' %>
在我看来
在开发模式下,如果我没有在上面的链接中指定主机explicilty,则Rails会抱怨。但我不想在制作中这样做。任何解决方案?
答案 0 :(得分:17)
要解决在ActionMailer中传递主机以生成网址的问题,请查看this plugin和reason 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')
这将生成如下网址:
同样,您可以传递一些参数
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
因此,如果链接未过期,您可以立即采取行动