【发布时间】:2015-04-13 23:14:36
【问题描述】:
在我的一个项目的运行时更改 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 应该使用哪个主机来发送特定的电子邮件。我可以覆盖 Devise 邮件程序并传递主机或类似的东西吗?
在我的情况下,以下解决方案是不可能的: Dynamic domain name in Rails action mailer while using sidekiq
顺便说一句:devise、devise-async 和 sidekiq 的完整工作流程本身有效(在开发、登台和生产中)。只有链接的主机不正确->这是我的大问题:-)..
【问题讨论】:
-
您好,您找到解决办法了吗?
-
@codingaddicted - 我在下面添加了我的答案。
标签: ruby-on-rails-4 devise sidekiq devise-async