Обновление Rails 5 сломало отложенные задачи - PullRequest
0 голосов
/ 13 февраля 2019

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

1 Ответ

0 голосов
/ 13 февраля 2019

Для версий ConfirmationMailer.delay.game_completion_feedback(user, date, feedback)

Для версий> Rails 4.2: ConfirmationMailer.game_completion_feedback(user, date, feedback).deliver_later

Пожалуйста, попробуйте использовать это и дайте нам знать, если это решит проблему.

Кроме того, при передаче переменных в ваш класс Mailer, использование метода with() создаст переменные экземпляра для использования в экземпляре mailer.Например:

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

Затем создаст @u, @d, @f в качестве переменных экземпляра для использования в вашем экземпляре Mailer.

Я не предлагаю вам называть ваши переменные как отдельные символы :) Но покажитечто вам не нужны позиционные аргументы.

...