Delayed_job: неопределенная ошибка метода при любом вызове

У меня есть приложение rails 3.0.5, которое отлично работало с delayed_job 2.1.4.

Прошло несколько недель с тех пор, как я коснулся приложения, но я только что пошел его настраивать и заметил, что delayed_job не работает. В частности, любой вызов delayed_job возвращает ошибку «неопределенный метод» в методе после задержки. (например, StudentMailer.delay.student_mail('test') возвращает "неопределенный метод" для "student_mail"). Я не могу понять, почему. Несколько вещей:

  • Замена StudentMailer.delay.student_mail('test') на StudentMailer.student_mail('test').deliver доставляет почту очень хорошо.

  • Не меняли никакие версии гема на сайте, они были заблокированы с момента разработки

  • RVM был удален и переустановлен

  • Происходит во всех методах рассылки

Код и ошибка ниже:

ПОЧТОВАЯ ПОЧТА:

class StudentMailer < ActionMailer::Base
  def course_signup(email, password, course, enrolment)
    @email = email
    @password = password
    @course = course
    @enrolment = enrolment
    @student = Student.where(:email => email).first
    if (@student.user.first_name && @enrolment.student.user.last_name) then
      @username = @student.first_name.gsub(/[^[:alnum:]]/, '').downcase + '.' + @student.last_name.gsub(/[^[:alnum:]]/, '').downcase
    else
      @username = "fcuser#{@student.id}"
    end
    mail(:to => email, :from => ENV['ACCOUNTS_EMAIL'], :subject => "You have been enrolled as a student for #{course}", :content_type => 'text/plain') 
  end
end

МОДЕЛЬ (почтовая программа вызывается при after_save)

  after_create {
    studentmailer = StudentMailer
    #studentmailer.course_signup(self.student.email, self.purchase.course).deliver
    randompass = RandomPassword.random_string(20)
    randomGatewayPass = RandomPassword.random_string(8)
    studentmailer.delay.course_signup(self.student.email, randomGatewayPass, self.purchase.course, self)
    self.save   }

КОНФИГ/ЗАГРУЗКА.RB

require 'yaml'
YAML::ENGINE.yamler = 'syck'

require 'rubygems'
gemfile = File.expand_path('../../Gemfile', __FILE__)
begin
  ENV['BUNDLE_GEMFILE'] = gemfile
  require 'bundler'
  Bundler.setup
rescue Bundler::GemNotFound => e
  STDERR.puts e.message
  STDERR.puts "Try running `bundle install`."
  exit!
end if File.exist?(gemfile)

ЗАДЕРЖКА ЗАДАНИЯ ОШИБКА:

{неопределенный метод course_signup' for #<Class:0x007fbcf61850c8> /Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/performable_mailer.rb:6:in perform'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/backend/base.rb:87:in invoke_job'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/worker.rb:120:in block (2 уровня ) в run'\n/Users/john/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/timeout.rb:58:in timeout'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/worker.rb:120:in block в run'\n/Users/john/ .rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/benchmark.rb:310:in realtime'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/worker.rb:119:in run'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/ gems/delayed_job-2.1.4/lib/delayed/worker.rb:177:in reserve_and_run_one_job'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/worker.rb:104:in block in work_off'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4 /lib/delayed/worker.rb:103:in times'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/worker.rb:103:in work_off'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/worker.rb: 78:in block (2 levels) in start'\n/Users/john/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/benchmark.rb:310:in realtime'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/worker.rb:77:in block in start'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/worker.rb:74:in loop'\n/Users /john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/worker.rb:74:in start'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/command.rb:104:in run'\n/Users/john/.rvm/gems/ruby -1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/command.rb:83:in block in run_process'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/daemons-1.1.4/lib/daemons/application.rb:249:in call'\n/Users/john/.rvm/gems/ruby -1.9.2-p290/gems/daemons-1.1.4/lib/daemons/application.rb:249:in block in start_proc'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/daemons-1.1.4/lib/daemons/daemonize.rb:197:in call'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/ daemons-1.1.4/lib/daemons/daemonize.rb:197:in call_as_daemon'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/daemons-1.1.4/lib/daemons/application.rb:253:in start_proc'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/daemons-1.1.4/lib/daemons /application.rb:293:in start'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/daemons-1.1.4/lib/daemons/controller.rb:70:in run'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/daemons-1.1.4/lib/daemons.rb:195:in block in run_proc'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/daemons-1.1.4/lib/daemons/cmdline.rb:109:in call'\ n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/daemons-1.1.4/lib/daemons/cmdline.rb:109:in catch_exceptions'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/daemons-1.1.4/lib/daemons.rb:194:in run_proc'\n/Users/john/.rvm/ gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/command.rb:81:in run_process'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/command.rb:75:in block в daemonize'\n/Users/john/.rvm/gems/ruby-1.9.2 -p290/gems/delayed_job-2.1.4/lib/delayed/command.rb:73:in times'\n/Users/john/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.1.4/lib/delayed/command.rb:73:in daemonize'\nscript/delayed_job:5:in `' | 06.09.2011 07:42:21 | НУЛЕВОЙ | 06.09.2011 07:43:00 | НУЛЕВОЙ | 2011-09-06 07:40:07 | 06.09.2011 07:43:00 |


person PlankTon    schedule 06.09.2011    source источник


Ответы (3)


Я гуглил ту же проблему, и я нашел решение для этого (это сработало для меня).

добавьте эти две строки в заголовок вашего config/application.rb

требуется «ямл»

YAML::ENGINE.yamler = 'syck'

затем перезапустите сервер (webrick/thin/независимо) и delayed_job (перезапустите пакет exec ./script/delayed_job)

Выполнено.

person Jeremy Hou    schedule 03.12.2012

У меня такая же проблема. Если вы используете тонкий, попробуйте выполнить "тонкий запуск пакета exec". Это сработало для меня.

person Nada Aldahleh    schedule 15.09.2011
comment
Я получаю ту же ошибку с приложением, развернутым в Heroku. Любая идея, как исправить это там? Кроме того, куда вы помещаете bundle exec thin start? Просто в терминале? - person Clay; 23.12.2011
comment
Та же проблема. Я пытаюсь отправить электронное письмо через delayed_job через консоль для тестирования (которая не использует тонкий). - person Frexuz; 24.12.2011
comment
я тоже. никто не разобрался? - person kateray; 16.01.2012

попробуйте изменить определение метода

 def self.course_signup 

or

 studentmailer = StudentMailer.new

потому что теперь вы вызываете метод из класса, но метод принадлежит объекту

person Fivell    schedule 06.09.2011