url_for不使用default_url_options [:host]值

时间:2012-10-26 20:59:43

标签: ruby-on-rails actionmailer

我有一个ActionMailer的视图,其中包含一些不同的链接。我现在正在localhost:3000上运行它,所以我在app / initializers中编写了一个名为setup_mail.rb的文件(如here所示):

ActionMailer::Base.default_url_options[:host] = "localhost:3000"

当我在视图中使用url_for时,它似乎不会提取此值。如果我然后将:host => "localhost:3000"添加到每个url_for标记,则它们可以正常运行。但如果没有包含它们,它们就无法运作。

我有另一个标记project_url,它显示为:指向项目的链接。这个功能,包括主机值,只有project_url(@project)。为什么一个工作而另一个工作呢?

从我读过的所有内容中,在初始化程序中设置default_url_options[:host]应该允许我省略:host标记中的url_for值。显然,添加该值并不是世界上最糟糕的事情,但这似乎是不必要的,这意味着当我最终在某个地方托管项目时,我将不得不经历并改变整个地方的价值。但更糟糕的是,这是我不明白的事情。当我走到这里时我还在学习,所以我想知道我做错了什么。

4 个答案:

答案 0 :(得分:3)

The documentation非常清楚

  

当您决定为邮件程序设置默认:主机时,您需要确保使用:only_path =>使用url_for时的false选项。由于url_for视图助手在默认情况下未显式提供:host选项时将默认生成相对URL,因此传递:only_path => false将确保生成绝对URL。

您可以创建自己的帮助程序,而不是使用url_for强制:only_path false

def your_url_for(options = {})
  options.reverse_merge! only_path: false
  url_for(options)
end

您还可以使用补丁导轨强制将其作为默认值,但这取决于您:)

这一切都是在添加

之外的
config.action_mailer.default_url_options = { host: "YOUR HOST" }

config/application.rb或等价物。

答案 1 :(得分:2)

似乎:only_path选项为false,默认情况下。因此,您需要为每个标记明确提供[:host],或者为url_for设置适用于所有标记的默认选项。以下是如何设置默认主机:

将此代码放入您的应用程序控制器&它应该工作。

helper_method :url_for
def default_url_options(options)
  { host: 'localhost:3000' }
end

有关详细信息,请查看set url_for defaults

答案 2 :(得分:1)

不是篡改全局默认设置,而是在初始化后不应该更改imho,您只需在邮件程序中定义一个方法default_url_options就像在控制器中一样:

class UserMailer < ActionMailer::Base
  def default_url_options
    { host: Tenant.current(true).host }
  end

  def confirm(user)
    @user = user
    mail(to: @user.email, subject: t(".subject_confirm"))
  end
end

答案 3 :(得分:-3)

您在ActionMailer :: Base中设置默认值,但似乎期望它重置ActionController :: Base的默认值。

A&lt;%= link_to%&gt;在你的邮件程序视图中,并不一定知道它在邮件程序视图中的任何事实。