我试图按照guide on using custom mailers覆盖devise的邮件程序。
# config/initializers/devise.rb
config.mailer = "AccountsMailer"
真的,我想为所有邮件程序操作动态设置主机。但目前,似乎只是reset_password_instructions
方法的基本覆盖甚至无法正常工作。
# app/mailers/accounts_mailer.rb
class AccountsMailer < Devise::Mailer
# allow use of before_filter
include AbstractController::Callbacks
def default_url_options
{ host: 'overridden.com' }
end
def reset_password_instructions(record, opts={})
raise 'overridden'
@host = 'overridden.co'
super
end
end
这让我怀疑设计是否甚至使用我的自定义邮件程序。
# views/customers/mailer/reset_password_instructions.html.erb
<% puts "*Mail View*" %>
<% puts @host %>
<% puts Devise.mailer %>
...
发送此邮件时,从我的forman日志开始:
mailer.1 | *Mail View*
mailer.1 |
mailer.1 | AccountsMailer
mailer.1 | Render customers/mailer/reset_password_instructions.html.erb
因此,Devise声称正在使用AccountsMailer,但方法覆盖不起作用,因为发送的消息不是引发异常,...
action_mailer.default_url_options[:host]
中静态设置environments/<env>.rb
,因为主机名是动态的,基于用户类型(员工和客户有不同的子域)
action_mailer.default_url_options
不接受过程或阻止SO搜索似乎没有看到其他人遇到这个问题,也没有设计GH问题 - 所以我忽略了什么?谢谢!
答案 0 :(得分:2)
呃,这最终成了一个版本问题。
我在devise
和devise-async
页面上阅读的文档引用了当前行为。我分别使用2.1.x和0.5.x.
在这些版本中,必须使用devise-async
config.mailer
明确地覆盖邮件程序(我不做)。从2.2.x和0.7.x开始,devise-async
隐式使用Devise.mailer
。
我已升级到2.2.x和0.7.x,这解决了上述代码的问题。
注意:如果从&lt; = 2.1.x升级到2.2.x,请注意2.2中引入的向后不兼容的更改