Ruby on rails 如何设置ActionMailer的默认url选项';s:动态承载请求';主机名是什么?

Ruby on rails 如何设置ActionMailer的默认url选项';s:动态承载请求';主机名是什么?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试设置:host for action mailer默认url选项 我在所有环境文件中都设置了以下内容 config.action_mailer.default_url_options = { :host => "localhost" } 我希望通过提供请求主机使其更具动态性 当我试图设定它的时候 config.action_mailer.default_url_options = { :host => request.domain } 或 它抛出错误。。。无法识

我正在尝试设置:host for action mailer默认url选项

我在所有环境文件中都设置了以下内容

config.action_mailer.default_url_options = {
  :host => "localhost"
}
我希望通过提供请求主机使其更具动态性

当我试图设定它的时候

config.action_mailer.default_url_options = {
  :host => request.domain
}

它抛出错误。。。无法识别“请求”对象


有没有什么方法可以将其设置为请求主机,而不是通过硬编码…?

问题是这些是初始化程序,它们在rails堆栈加载时运行,而不是在调用active mailer时运行

但是您不必使用默认的url,您只需将主机名传递到每个邮件程序视图中的/named routes的url中即可。默认设置只是避免了这样做


请参阅有关生成URL的部分。

更新:使用所选响应,因为这不是线程安全的

您可以创建如下所示的默认过滤器:

# 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

(来源:)

也可以通过在default\u url\u options散列中设置:host选项来设置将在所有邮件程序中使用的默认主机

应用程序\u controller.rb
中添加:

class ApplicationController < ActionController::Base
  def default_url_options
    { host: request.host_with_port }
  end
end

资料来源:

显然(而且令人愤怒)这是不允许的。我得到了这个错误:
RuntimeError(您不能再直接调用ActionMailer::Base.default\u url\u options。您需要设置config.action\u mailer.default\u url\u选项。如果您单独使用ActionMailer,您需要直接包含路由url\u helpers。)
对此不确定@nathan.f77。我可以设置为:
ActionMailer::Base.default\u url\u options={:host=>request.host\u with\u port}
@SooDesuNe,现在已经不推荐了。你不能再直接设置了。那么解决方案是什么呢?在我看来,虽然能够通过config对象在初始值设定项中设置内容很有用,但在ActionMailer初始化之后,应该总会有一种方法来修改配置。。。但这似乎对我来说仍然有效,就像Rails 3.0.9中一样,所以我想这暂时有效…使用这个线程安全的解决方案:ActionMailer::Base没有访问请求对象的权限。before filter方法有效,但不是线程安全的,使其仅适用于涉及单个域的情况。在筛选方法之前-拜拜'config.action\u mailer.default\u url\u options'per environment!:)@BradWerth你能解释一下为什么这只适用于使用单一域的应用程序吗?@pixelearth sorta-like,但适用于主机
class ApplicationController < ActionController::Base
  def default_url_options
    { host: request.host_with_port }
  end
end
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