Rails + Devise + delayed_job?

时间:2010-11-08 16:05:12

标签: ruby-on-rails ruby-on-rails-3 heroku devise

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

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

9 个答案:

答案 0 :(得分:24)

来自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

答案 1 :(得分:12)

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

答案 2 :(得分:6)

我发现以上都不适合我。我正在使用Devise 2.0.4和Rails 3.2.2 with 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

答案 3 :(得分:3)

这对我有用:

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

根据您所使用的设计模块

,您可能不需要所有这些模块

答案 4 :(得分:1)

我不确定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中的初始化程序中异步传递,或者为此产生影响。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

handle_asynchronously :send_devise_notification, :queue => 'devise'

答案 8 :(得分:-4)

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

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