Rails 5升级破坏了延迟任务

问题描述 投票:0回答:1

我将我的Rails应用程序从Rails 4.2升级到Rails 5.0,现在很多我在升级前创建的delayed jobs都破了。我收到以下错误:

undefined method 'game_completion_feedback' for ConfirmationMailer:Class

即使我有ConfirmationMailer类中定义的方法,并且该类中没有任何更改,或者在升级时调用它。

在做一个YAML.load_dj我得到以下错误:

ArgumentError: undefined class/module ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer
from <path>/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/psych/class_loader.rb:53:in `path2class'
Caused by NameError: uninitialized constant 
ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer
from <path>/.rvm/gems/ruby-2.2.5/gems/activesupport-5.0.7.1/lib/active_support/inflector/methods.rb:283:in `const_get' 

它看起来像是因为在Rails 4.2到Rails 5.0升级期间发生了一些变化。

我在网上发现运行Rails.cache.clear可以帮助解决这个问题,但我在tmp环境中的production文件夹是空的,所以运行Rails.cache.clear只会抛出一个错误:

No such file or directory @ dir_initialize - /var/app/current/tmp/cache/

有什么方法可以让这些旧的延迟工作仍然在Rails 5.0工作,或者我只是必须单独重建所有这些工作?

我的ConfirmationMailer课程:

class ConfirmationMailer < ApplicationMailer
  def game_completion_feedback(user, date, feedback)
    @user     = user
    @date     = format_time(date.to_time)
    @feedback = feedback

    mail(to: user.email, subject: 'Game Completed')
  end
end

我将该功能称为:

def send_feedback_to_client
  ConfirmationMailer.delay.game_completion_feedback(user, date, feedback)
end

这也是在其他情况下,我称之为Struct,如:

class RemindersForGame < Struct.new(:gamer_email, :leader_email, :start)
  def perform
    ConfirmationMailer.game_reminder_email_gamer(gamer_email, leader_email, start).deliver_now
    ConfirmationMailer.game_reminder_email_leader(gamer_email, leader_email, start).deliver_now
  end
end

我把这个struct称为:

def create_reminder_email(start)
  reminders = Delayed::Job.enqueue RemindersForGame.new(client.user, coach, start),
                                 run_at: start - 2.day,
                                 queue: 'game_reminder'

self.reminders_job_id = reminders.id

结束

game_reminder_email_gamergame_reminder_email_leader被定义为与该类中的其他方法完全相同的方式,并且我没有改变与它如何被调用有关的任何内容。

ruby-on-rails ruby ruby-on-rails-5 delayed-job ruby-on-rails-4.2
1个回答
0
投票

对于版本<Rails 4.2:ConfirmationMailer.delay.game_completion_feedback(user, date, feedback)

对于版本> Rails 4.2:ConfirmationMailer.game_completion_feedback(user, date, feedback).deliver_later

请尝试使用此功能,如果它解决了问题,请告诉我们。

此外,在将变量传递给Mailer类时,使用with()方法将创建实例变量供您在邮件程序实例中使用。例如:

ConfirmationMailer.with(u: user, d: date, f: feedback).game_completion_feedback.deliver_later

然后将@u, @d, @f创建为实例变量,以便在Mailer实例中使用。

我不是建议你将变量命名为单个字符:)但是表明你不需要位置参数。

© www.soinside.com 2019 - 2024. All rights reserved.