Resque Rails 4.2中的deliver_later Mailers

3

我有一个Ruby on Rails应用程序,在其中需要在面试前一天发送申请人提醒邮件。为此,我计划使用The Rescue Scheduler,我正在使用Rails v4.2。我已经运行了redis服务器,我的代码如下:

    def sendemails
        @user2=User.new( :firstname=> "Betterlucknexttime",:email=>)
        SendEmailJob.new.perform(@user)
    end

并且在sendEmail文件中

    class SendEmailJob < ActiveJob::Base
        queue_as :default
        def perform(user)
            UserMailer.welcome_email(user).deliver_later
        end
    end

在config/developement文件中,我设置了 config.active_job.queue_adapter = :resque 我检查了日志文件,看到以下内容:

[ActiveJob] 无法记录“enqueue.active_job”事件。 URI::GID::MissingModelIdError: 无法为没有模型ID的User创建全局ID。app/jobs/send_email_job.rb:5:in perform'
app/controllers/adminusers_controller.rb:45:in sendemails'

通常情况下,当我不使用deliver_later选项时,我的电子邮件可以立即发送。但是,我需要使用deliver_later在未来作为提醒发送这些电子邮件。非常感谢您的帮助!
1个回答

3

由于您使用了User.new,因此并未将该用户保存到数据库中。当作业启动时,没有从数据库中提取用户。如果改为使用User.create,则应按预期工作。

这里是一篇介绍active job及其使用方法的文章链接:http://www.sitepoint.com/new-rails-shiny-activejob/


1
这里有更多关于为什么这个方法可行的细节。deliver_later 依赖于全局 ID 来安排/排队作业(一种避免序列化整个对象的方式,通过将数据保存在数据库中并稍后使用 ID 检索它)。由于全局 ID 只在保存时创建,因此在测试中查找时会丢失。.create 方法在幕后调用 .new 和 .save。 - Thiago Figueiro

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