Rails不使用Heroku Redis在后台发送电子邮件

时间:2016-04-20 00:14:41

标签: ruby-on-rails heroku background redis sidekiq

我在后台使用rails应用程序发送电子邮件时遇到问题。如果我尝试在非背景情况下这样做,我能够成功发送相同的欢迎电子邮件。我正在heroku上测试这个应用程序并添加了heroku redis并在仪表板中启用了worker功能。我没有足够的经验与redis或sidekiq一起自行解决这个问题。寻找有关如何纠正此问题的建议。

这是我的Devise Registrations Controller中的命令:

class RegistrationsController < Devise::RegistrationsController

  def create
    super
    if @user.persisted?
      WelcomeEmailJob.perform_later(current_user.id)
    end
  end
end

后台工作代码:

class WelcomeEmailJob < ActiveJob::Base
  queue_as :default

  def perform(user_id)
    user = User.find(user_id)
    WelcomeMailer.welcome_email(user).deliver       
  end
end

欢迎电子邮件:

class WelcomeMailer < ApplicationMailer
 def welcome_email(user)
    @user = user
    @url  = 'http://example.com/login'
    mail(to: @user.email, subject: 'Welcome to My Website')
  end
end

我一直在heroku日志中看到类似这样的回应

2016-04-20T00:11:25+00:00 app[heroku-redis]: source=REDIS sample#active-connections=1 sample#load-avg-1m=0.09 sample#load-avg-5m=0.125 sample#load-avg-15m=0.12 sample#read-iops=0 sample#write-iops=0.020492 sample#memory-total=15405632.0kB sample#memory-free=13388156.0kB sample#memory-cached=493144kB sample#memory-redis=295880bytes sample#hit-rate=1 sample#evicted-keys=0

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

你是如何引发这份工作的?你有一个cron工作设置?如果您使用的是Rails的最新版本,那么也不推荐使用deliver并将其替换为deliver_now。

尝试:

class RegistrationsController < Devise::RegistrationsController

  def create
    super
    if @user.persisted?
      WelcomeMailer.welcome_email(user).deliver_later
    end
  end
end

这会将它排入邮件队列。没有额外的工作类,因为动作邮件将为您处理它。您只需要确保所有工作人员都被解雇并处理我认为需要遵循heroku特定文档设置的工作(我不使用heroku所以不完全确定这需要什么)。