我在我的一个项目的运行时更改 ActionMailer::Base.default_url_options = {:host => host} 时遇到问题。
设置:我有多个子域,它们在后端使用相同的 Rails-Application。我想通过 Sidekiq 队列将我的设计邮件发送给用户。设计邮件(确认、重置密码)包含链接,这些链接需要特定的子域才能正确。
我的环境
rails (4.2.0)
sidekiq (3.3.1)
devise (3.4.1)
devise-async (0.9.0)
我的 application_controller 中有一个 before_action
class ApplicationController < ActionController::Base
before_action :set_action_mailer_default_url_options
private
def set_action_mailer_default_url_options
host = "my-logic-to-get-the-correct-host"
ActionMailer::Base.default_url_options = {:host => host}
end
end
现在,如果我想重置我的密码,我总是会得到我在环境文件中指定的默认 url 选项。如果我从我的环境中删除 default_url_options,我会在我的 sidekiq 日志中得到默认的设计错误。
ActionView::Template::Error: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
主机始终在控制器中正确设置。我已经调试过了。似乎主机没有传递给sidekiq ..知道如何解决这个问题吗?
我无法将子域保存在某处,因为用户可以触发来自不同子域的电子邮件,并且并不总是相同。我需要一种方法来告诉 Devise 应该使用哪个主机来发送特定的电子邮件。我可以覆盖设计邮件并传递主机或类似的东西吗?
在我的情况下,以下解决方案是不可能的: 使用 sidekiq 时 Rails action mailer 中的动态域名
顺便说一句:包含设计、设计异步和 sidekiq 的完整工作流程本身可以工作(在开发、登台和生产中)。只有链接的主机不正确->这是我的大问题:-)..