Я обновил свое 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
end
game_reminder_email_gamer
и game_reminder_email_leader
определенытак же, как и другой метод в этом классе, и я ничего не изменил, связанный с тем, как он вызывается.