覆盖Devise :: Mailer无法正常工作

时间:2013-06-03 20:34:19

标签: ruby-on-rails devise sidekiq

我试图按照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,但方法覆盖不起作用,因为发送的消息不是引发异常,...


相关设置

  • Rails 3.2.13
  • Ruby 1.9.3-p374
  • Devise 2.1.2
  • Devise-async 0.5.1
  • Sidekiq 2.12.0
  • Foreman 0.61.0
    • web:bundle exec unicorn -p $ PORT -c ./config/unicorn.rb
    • db:postgres -D / usr / local / var / postgres
    • redis:redis-server /usr/local/etc/redis.conf
    • mailcatcher:mailcatcher -f
    • worker:bundle exec sidekiq -q high,2 -q default -e development -c 1
    • mailer:bundle exec sidekiq -q mailer -e development -c 1

免责声明

  • 是的,我重新启动了foreman / my server
  • 我无法在action_mailer.default_url_options[:host]中静态设置environments/<env>.rb,因为主机名是动态的,基于用户类型(员工和客户有不同的子域)
    • action_mailer.default_url_options不接受过程或阻止
  • 在每个视图中设置主机名太吵了,让我无法入睡

SO搜索似乎没有看到其他人遇到这个问题,也没有设计GH问题 - 所以我忽略了什么?谢谢!

1 个答案:

答案 0 :(得分:2)

呃,这最终成了一个版本问题。

我在devisedevise-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中引入的向后不兼容的更改