url_for 不使用default_url_options[:host] 值

Ben*_*ley 6 ruby-on-rails actionmailer

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

ActionMailer::Base.default_url_options[:host] = "localhost:3000"
Run Code Online (Sandbox Code Playgroud)

当我去url_for视图中使用时,它似乎没有拉出这个值。如果我然后添加:host => "localhost:3000"到每个url_for标签,它们就会正常工作。但如果不包含这些,它们就无法工作。

我有另一个标签 ,project_url正如它所显示的那样:指向指定项目的链接。该函数(包括主机值)只需project_url(@project). 为什么其中一个有效,而另一个却不起作用?

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

dee*_*our 4

文档对此非常清楚

\n\n
\n

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

\n
\n\n

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

\n\n
def your_url_for(options = {})\n  options.reverse_merge! only_path: false\n  url_for(options)\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

您也可以猴子补丁导轨强制将此设置为默认值,但这取决于您:)

\n\n

这一切都是除了添加

\n\n
config.action_mailer.default_url_options = { host: "YOUR HOST" }\n
Run Code Online (Sandbox Code Playgroud)\n\n

config/application.rb或同等水平。

\n