繁体   English   中英

Rails + Devise + delayed_job?

[英]Rails + Devise + delayed_job?

我在Heroku上使用Devise有一个Rails 3应用程序。 问题是我正在发送带有Sendgrid的电子邮件,而且电子邮件递送速度很慢,这会让应用程序挂起。 所以我有兴趣使用delayed_job在后台排队电子邮件,因此我的应用程序响应用户。

Devise如何与delayed_job一起使用? 设置Devise以使用delayed_job的任何方法?

来自Robert May: https//gist.github.com/659514

将其添加到config/initializers目录中的文件:

module Devise
  module Models
    module Confirmable
      handle_asynchronously :send_confirmation_instructions
    end

    module Recoverable
      handle_asynchronously :send_reset_password_instructions
    end

    module Lockable
      handle_asynchronously :send_unlock_instructions
    end
  end
end

根据Devise wiki页面devise-async gem将为您处理此问题。 它支持delayed_job,resque和sidekiq。

我发现以上都不适合我。 我正在使用Devise 2.0.4和Rails 3.2.2以及delayed_job_active_record 0.3.2

设计实际上谈论在代码中的注释中做这样的事情的方式是覆盖User类中的方法。 因此,我这样解决了它,它完美地工作:

应用程序/模型/ User.rb

def send_on_create_confirmation_instructions
  Devise::Mailer.delay.confirmation_instructions(self)
end
def send_reset_password_instructions
  Devise::Mailer.delay.reset_password_instructions(self)
end
def send_unlock_instructions
  Devise::Mailer.delay.unlock_instructions(self)
end

这对我有用:

在app / models / user.rb中

  # after your devise declarations
  handle_asynchronously :send_reset_password_instructions
  handle_asynchronously :send_confirmation_instructions
  handle_asynchronously :send_on_create_confirmation_instructions

您可能不需要所有这些,具体取决于您所包含的设计模块

我不确定Devise提供了一种简单的方法来进行电子邮件传递的后台处理。 但是有一些方法可以使用DelayedJoy来做到这一点。 DelyedJob提供了一个“handle_asynchronously”函数,如果注入DeviseMailer,可以确保在后台发生交付。

在config / application.rb中尝试这个

config.after_initialize do 
  ::DeviseMailer.handle_asynchronously :deliver_confirmation_instructions 
  # or
  ::DeviseMailer.handle_asynchronously :deliver!
end

你需要尝试一下。 您还可以尝试继承DeviseMailer并将其设置为在config / initializer / devise_mailer_setup.rb中的初始化程序中异步传递,或者为此。

对于使用Devise的 delayed_job_active_record ,只需使用以下内容即可。 (将其添加到user.rb model

handle_asynchronously :send_devise_notification, :queue => 'devise'

不确定为什么需要验证任何delayed_job任务。 只需让Devise认证的控制器操作将电子邮件传递排队到库方法。

我使用delayed_job_mailer插件在Rails 2应用程序中完成此操作。 不确定它是否适用于Rails 3。

我一般认为最好避免任何和所有后台作业任务管理器可用于Ruby和Rails期间。 他们很糟糕。

相反,我使用crontab,这是一个古老的程序,非常擅长它的工作。 只需制作一个脚本来经常进行脏工作,并告诉crontab使用rails runner在正确的时间运行它。 这使得那些讨厌的长时间运行任务超出了Rails应用程序其余部分的运行时间,但是如果你想要/需要它,你仍然可以访问数据库和整个Rails堆栈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM