我有一个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
值。显然,添加该值并不是世界上最糟糕的事情,但这似乎是不必要的,这意味着当我最终在某个地方托管项目时,我将不得不经历并改变整个地方的价值。但更糟糕的是,这是我不明白的事情。当我走到这里时我还在学习,所以我想知道我做错了什么。
答案 0 :(得分:3)
当您决定为邮件程序设置默认:主机时,您需要确保使用: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;在你的邮件程序视图中,并不一定知道它在邮件程序视图中的任何事实。