通过Resque发送Devise邮件

12

我正在尝试通过 Resque 发送 Devise 邮件。

常规邮件可以正常地通过 Resque 发送。而且 Devise 邮件也可以成功发送,但是不包括通过 Resque 发送的 Devise 邮件。我收到了“找不到有效映射”的错误消息,这意味着我的助手覆盖没有被捕获。

我正在遵循这篇文章:http://shaker.4-dogs.biz/2011/08/06/using-resque-to-send-mail-for-devise/

奇怪的是,为了调试它,我正在使用Devise的本地副本,并在 Devise 的 'initialize_from_record' 中添加断点(当我单独使用 Devise 时会命中),但是当我通过 Resque 发送 Devise 邮件时,断点不会命中:

class ResqueMailer < Devise::Mailer
  include Resque::Mailer
end

config.mailer = "ResqueMailer"

而Resque则显示了一个经过打包的 gem 路径,而不是我的本地源代码路径,例如:

/Users/mm/.rvm/gems/ruby-1.9.2-p290@evergreen/gems/devise-1.4.9/lib/devise/mailers/helpers.rb:20:in `devise_mail'
有任何想法为什么它没有使用我的本地 gem 源或者如何使 Resque 发送我的 Devise 邮件?

这个问题似乎已经在最新版本的resque_mailer(2.2.3)中得到了修复。 - tee
2个回答

8
一个简单的方法是使用 devise-async gem。
将该gem添加到您的Gemfile中。
# Gemfile
gem "devise-async"

配置Devise使用代理邮件程序。

# config/initializers/devise.rb
config.mailer = "Devise::Async::Proxy"

[可选] 最后告诉 DeviseAsync 使用 Resque 来排队邮件。
# config/initializers/devise_async.rb
Devise::Async.backend = :resque

这个 gem 还支持 Sidekiq 和 Delayed::Job。

这个 gem 是否通过 Resque Mailer 进行处理,还是使用了完全不同的队列? - James McMahon

4

更新:您不需要在resque_mailer>= 2.2.3中进行此操作

位于https://github.com/devton/resqued_devise_mailer的猴子补丁无法正常工作,因为它将整个模型作为参数发送给Resque,这将导致对对象进行编组并受到反感(请参见https://github.com/defunkt/resque上的持久性)。

以下是我使用的方法:

使用resque_mailer gem:https://github.com/zapnap/resque_mailer

gem 'resque_mailer'

添加lib/devise_resque_mailer.rb:请参见https://gist.github.com/1375726

这将创建一个新的DeviseResqueMailer类,不会更改Resque::Mailer中的任何现有行为,因此您可以在其他邮件发送器中使用该模块。

config/initializers/devise.rb:

Devise.setup do |config|
  require 'devise_resque_mailer'
  config.mailer = "DeviseResqueMailer"

将设备视图从app/views/devise/mailer/移动到app/views/devise_resque_mailer/

1
使用最新版本的resque_mailer(2.2.3),上述hack是不必要的。 - tee
上面的“hack”是什么?整个答案还是特定部分的答案? - James McMahon
整个答案就是hack。从2.2.3+开始,resque_mailer应该可以直接使用。 - tee
它应该可以直接与Devise一起使用,这意味着devise-async gem是不需要的吗?因为这并不是我的发现。 - James McMahon
你需要使用 devise-async 或者 resque_mailer 来在 devise 中发送异步邮件。如果你使用 resque_mailer,那么可以忽略我的回答。这个回答是一个 hack,不需要使用它来让 resque_mailer 工作。 - tee
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接