Ruby on rails Rails:在ActionMailer视图中生成完整URL

Ruby on rails Rails:在ActionMailer视图中生成完整URL,ruby-on-rails,actionmailer,host,url-for,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' %>

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

我正在使用:

<%= url_for :controller => 'login', :action => 'verify', :guid => @user.new_user.guid, :only_path => false, :host => 'http://plantality.com' %>
'login',:action=>'verify',:guid=>@user.new\u user.guid,:only\u path=>false,:host=>'http://plantality.com' %>
在我看来

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

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

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

您可以在config/environments/production.rb中执行相同的操作,以解决在ActionMailer、check out和中传递用于生成URL的主机的问题

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

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

注意,我使用的是
login\u url
,而不是
login\u path
,我认为这不是100%正确的方法,但这也是一个解决方案:


请参阅中的使用资源主机部分。您需要指定一个
资产\u主机
。您还可以通过请求链接
“#{request.protocol}{request.host_with_port}/login/?guid=#{@user.new_user.guid}”

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

转到
/config/environments
并添加:

config.absolute\u site\u url='your site url'

用于各自的环境(即development.rb、test.rb或production.rb中)。重新启动web服务器


这允许您调用
Rails.application.config.absolute\u site\u url
以获得所需的url。不需要插件或奇怪的欺骗,只需将站点url存储为应用程序范围的变量。

要生成url,请尝试以下操作

Rails.application.routes.url_helpers.user_url(User.first.id, host: 'yourhost.io')
这将生成如下url:

你也可以传递一些参数

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

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


所以,如果链接未过期,您可以使用werifi操作

我正在使用您提供的语法,但没有:主机部分,我将获得完整的URL:只有_path=>false才重要。
request
是否存在于action mailer视图中?如果是背景工作呢?
expires = Time.now + 2.days
params = {expires: expires}
u = User.first.id

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