5

我有一个包含几个不同链接的 ActionMailer 视图。我现在在 localhost:3000 上运行它,所以我已经setup_mail.rb在 app/initializers 中调用的文件中设置了它(如此处所示

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

4 回答 4

3

文档对此非常清楚

当你决定为你的邮件设置一个默认的 :host 时,你需要确保在使用 url_for 时使用 :only_path => 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或等价物。

于 2012-10-26T21:48:35.410 回答
2

默认情况下,选项似乎:only_path是 false 。这就是为什么您需要 [:host]为每个标签显式提供或设置url_for适用于所有标签的默认选项的原因。这是设置默认主机的方法:

将此代码放在您的应用程序控制器中,它应该可以工作。

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

有关更多详细信息,请检查set url_for defaults

于 2012-10-26T21:18:32.150 回答
1

而不是篡改初始化后不应该更改的全局默认设置,您可以简单地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
于 2014-04-11T21:17:27.943 回答
-3

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

邮件视图中的 <%= link_to %> 不一定知道它在邮件视图中的事实。

于 2012-10-26T21:19:15.753 回答