【问题标题】:Getting full URL as displayed in browser URL bar获取浏览器 URL 栏中显示的完整 URL
【发布时间】:2015-11-16 06:19:52
【问题描述】:

我有一个 Rails 应用程序,我想在人们注册时向他们发送电子邮件。该电子邮件包含指向他们的照片门户的链接,因此他们可以开始添加照片等。

class MyMailer < ActionMailer::Base
  def welcome_email
    # ...

    link = photos_url  # => www.myapp.com/photos

    # ...
  end
end

问题是,当我将代码推送到 Heroku 并实时运行时,该链接不会按预期生成。

photos_url 返回相对于localhost 的 URL 并最终生成 myapp.herokuapp.com/photos,这是不正确的。

更奇怪的是,如果我用binding.pry 暂停代码并尝试查看photos_url 返回的内容,它会按预期正确返回www.myapp.com/photos

关于如何解决这个问题的任何想法?我不希望自己从头开始构建 URL,因为这意味着我必须为每个环境(localhoststagingproduction 等)都这样做

谢谢!

【问题讨论】:

标签: ruby-on-rails url heroku


【解决方案1】:

ActionMailer 不依赖于请求/响应周期,因此它不知道应用程序当前运行的主机是什么。实际上,电子邮件通常是由一些对当前请求 URL 一无所知的后台工作进程发送的。

因此,要使其正常工作,您需要设置 ActionMailer default_url_options.host 选项。

将此添加到您config/environments/production.rb

config.action_mailer.default_url_options = { host: 'www.yourapp.com' }

【讨论】:

  • 啊,我明白了!所以我在这个例子中使用了ActionMailer,因为它是众所周知的,但在我的特殊情况下,我使用了一个名为 Mandrill 的服务,它允许你点击它的 api 并发送一封电子邮件。该作业由 Sidekiq 在后台处理。但是同样的问题仍然存在——后台工作进程(Sidekiq)不知道主机。有没有更通用的方法来获取主机?听起来我必须为每个环境手动配置它。谢谢!
  • 一般来说,您可以使用环境变量设置主机名,例如APP_HOST=www.foo.com,然后将该变量传递给 mail-api 特定方法(不确定 Mandrill 是哪一个)。 Mandril 也可能会在其设置 UI 中的某处设置主机。
猜你喜欢
  • 2021-01-14
  • 2010-11-18
  • 2019-05-10
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多