代码之家  ›  专栏  ›  技术社区  ›  anonn023432

Rails 5升级中断了延迟的任务

  •  0
  • anonn023432  · 技术社区  · 6 年前

    我升级了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/

    有什么办法可以让这些被耽搁的老工作继续工作吗 轨道5.0 或者我只需要单独重新创建它们?

    确认邮件

    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_gamer game_reminder_email_leader 被定义为与该类中的其他方法完全相同的方式,并且我没有更改与如何调用它相关的任何内容。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Sebastian Scholl    6 年前

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

    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实例中使用的实例变量。

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

        2
  •  0
  •   DrewB    5 年前

    ArgumentError: undefined class/module ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer 是由轨道5的变化引起的 ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Float

    class UpdatePostgresDataTypeInDj < ActiveRecord::Migration[5.1]
      REPLACEMENTS = {
        'ruby/object:ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer': 'ruby/object:ActiveModel::Type::Integer',
        'ruby/object:ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Float': 'ruby/object:ActiveModel::Type::Float',
      }
    
      def up
        REPLACEMENTS.each do |old, new|
          Delayed::Job.where("handler LIKE ?", "%#{old}%")
            .update_all("handler = replace(handler, '#{old}', '#{new}')")
        end
      end
    
      def down
        REPLACEMENTS.each do |old, new|
          Delayed::Job.where("handler LIKE ?", "%#{new}%")
            .update_all("handler = replace(handler, '#{new}', '#{old}')")
        end
      end
    end