首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带Devise的Resque和Resque_mailer

带Devise的Resque和Resque_mailer
EN

Stack Overflow用户
提问于 2013-01-12 05:04:45
回答 2查看 629关注 0票数 0

我正在使用resque_mailer gem (https://github.com/zapnap/resque_mailer)通过Resque实现后台电子邮件处理。除了Devise发送的邮件之外,我所有的邮件都可以使用它。

我检查了一堆SO问题和博客帖子(例如http://teeparham.posterous.com/send-devise-emails-with-resque),但找不到让它工作的方法。

让resque_mailer与Devise协同工作的确切步骤是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-12 05:40:31

我会看一下devise-async。看起来很适合你的用例。Devise Async

票数 0
EN

Stack Overflow用户

发布于 2015-10-14 08:42:48

我在网上浏览了tee's answer和几个资源,但没有找到一个有效的解决方案。

在阅读了几天的resque-mailer和设计代码后,我找到了一个对我有效的解决方案。感谢gist的tee,它让我找到了正确的方向。

假设您的app/mailers/application_mailer.rb看起来类似于

代码语言:javascript
复制
class ApplicationMailer < ActionMailer::Base
  include Resque::Mailer # This will add a `self.perform` class method, which we will overwrite in DeviseResqueMailer
end

config/initializers/devise.rb

代码语言:javascript
复制
Devise.parent_mailer = "ApplicationMailer" 

Devise.setup do |config|
  config.mailer = 'DeviseResqueMailer'
end 

在使用devise的资源类中,重写send_devise_notification方法以发送资源类和id而不是对象,以防止编组

代码语言:javascript
复制
# app/models/user.rb
protected    
def send_devise_notification(notification, *args)
  # Based on https://github.com/zapnap/resque_mailer/blob/64d2be9687e320de4295c1bd1b645f42bd547743/lib/resque_mailer.rb#L81
  # Mailer may completely skip Resque::Mailer in certain cases - and will fail as we write custom handle in DeviseResqueMailer assuming mails are handled via resque
  # So in those cases, don't retain original devise_mailer so things work properly
  if ActionMailer::Base.perform_deliveries && Resque::Mailer.excluded_environments.exclude?(Rails.env.to_sym)
    # Originally devise_mailer.send(notification, self, *args).deliver
    # Modified to ensure devise mails are safely sent via resque
    resource_id, resource_class = self.id, self.class.name
    devise_mailer.send(notification, {resource_id: resource_id, resource_class: resource_class}, *args).deliver
  else
    super
  end
end

最后,在app/mailers/devise_resque_mailer.rb中,再次从数据库获取记录并继续

代码语言:javascript
复制
class DeviseResqueMailer < Devise::Mailer

  def self.perform(action, *args)
    # Hack to prevent RuntimeError - Could not find a valid mapping for admin.attributes
    record_hash = args.shift
    record = record_hash["resource_class"].constantize.find(record_hash["resource_id"])
    args.unshift(record)
    super # From resque-mailer
  end
end

我觉得这种方法比使用devise-async更好,因为所有的邮件都通过相同的代码路径。如果需要,更容易控制和覆盖。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14286601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档