我正在尝试设置:host for action mailer default url options。
我在所有环境文件中都有以下设置
config.action_mailer.default_url_options = {
:host => "localhost"
}
我希望通过提供请求主机使其更具动态性。
当我尝试通过
设置它时config.action_mailer.default_url_options = {
:host => request.domain
}
OR
config.action_mailer.default_url_options = {
:host => request.env["SERVER_NAME"]
}
它抛出错误...无法识别“请求”对象
有什么方法可以将它设置为请求主机,而不是通过硬编码......?
答案 0 :(得分:45)
也可以通过在default_url_options哈希中设置:host选项来设置将在所有邮件程序中使用的默认主机
在application_controller.rb
添加:
class ApplicationController < ActionController::Base
def default_url_options
{ host: request.host_with_port }
end
end
来源:https://edgeguides.rubyonrails.org/action_controller_overview.html#default-url-options
或者,您可以在从控制器调用邮件程序功能时传递request
class UserMailer < ActionMailer::Base
def welcome_email(user, request)
@user = user
@url = user_url(@user, host: request.host_with_port ) # do this for each link
mail(:to => user.email, :subject => "Welcome to My Awesome Site")
end
end
来源:https://guides.rubyonrails.org/action_mailer_basics.html#generating-urls-with-named-routes
答案 1 :(得分:10)
更新:使用选定的响应,因为这不是线程安全的。
您可以像这样创建默认过滤器:
# application_controller.rb
before_filter :mailer_set_url_options
...
def mailer_set_url_options
ActionMailer::Base.default_url_options[:host] = request.host_with_port
end
答案 2 :(得分:6)
问题是这些是初始化程序,它们在加载rails堆栈时运行,而不是在您调用活动邮件程序时运行。
但您不必使用default_url,您只需将主机名传递到每个邮件程序视图中的url_for / named路由即可。默认只是避免必须这样做。
请参阅有关生成网址的http://api.rubyonrails.org/classes/ActionMailer/Base.html部分。