delayed_job: NoMethodError

Aquí está mi pequeño controlador Rails3:

class HomeController < ApplicationController def index HomeController.delay.do_stuff end def self.do_stuff puts "Hello" end end 

Al acceder al index , el trabajo se inserta correctamente en la base de datos:

 --- !ruby/struct:Delayed::PerformableMethod object: !ruby/object:Class HomeController method_name: :do_stuff 

PROBLEMA: Al ejecutar bundle exec rake jobs:work , obtengo:

 Class#do_stuff failed with NoMethodError: undefined method `do_stuff' for # 

A pesar de que HomeController.do_stuff funciona perfectamente. ¿Alguna idea?

Consulte https://github.com/collectiveidea/delayed_job/wiki/Common-problems#wiki-undefined_method_xxx_for_class en la documentación.

Parece que deberías tener

..object: !ruby/class HomeController method_name ...

en la base de datos, pero tienes

..object: !ruby/object:Class HomeController method_name ...

en lugar. Cual es malo.

Incluso el autor delayed_job no sabe la razón. De alguna manera depende del servidor web en el que se ejecute. Prueba la recomendación de la wiki.

Yo tuve el mismo problema.

Encontré varias discusiones que indicaban que la aplicación web ponía en cola los distintos analizadores yaml cuando la tarea web ponía el trabajo y cuando se ejecutaba más tarde.

Algunos sugieren que se debería usar el analizador psicológico. Algunos sugieren syck. Primero probé la psicología pero terminé con problemas de incompatibilidad con otras gems. Así que elegí syck.

No pude ordenar qué archivos de configuración son utilizados por el servidor web y la cola. Después de mucha experimentación, terminé con las siguientes configuraciones (todas ellas en la parte superior del archivo):

 #application.rb require File.expand_path('../boot', __FILE__) require 'rails/all' require 'yaml' YAML::ENGINE.yamler= 'syck' # ... 

y

 #environment.rb require 'yaml' YAML::ENGINE.yamler= 'syck' # ... 

y

 #boot.rb require 'yaml' YAML::ENGINE.yamler= 'syck' require 'rubygems' # ... 

Estoy usando Ruby 1.9.3, Rails 3.2.8, Webrick, delayed_job 3.0.3

En mi caso, el problema se debió principalmente a que pasaba Hash como parámetro al objeto que se pasó a la cola delayed_job. Pero después de 25 rastros, llegué a la conclusión de que delayed_job acepta objetos solo con un entero como parámetro. Por lo tanto, almacené todos los parámetros en la base de datos y luego pasé esa identificación de registro como parámetro a delayed_job y dentro de la función de ejecución, podemos acceder a todos los parámetros con esa identificación de registro y eliminar ese registro después de recuperar esos datos.

 Delayed::Job.enqueue LeadsJob.new(params[:customer]) # this job will be queued but will never run, this is because of the way Delayed_job serializes and De-serializes the objects. 

en lugar de hacer algo como esto

 @customer = Customer.create(params[:customer]) Delayed::Job.enqueue LeadsJob.new(@customer.id) 

Si los detalles del cliente fueron solo para pasar los parámetros, elimine ese registro dentro de la función.

Por favor, hazme un ping si necesitas más detalles sobre el mismo.

El problema también podría deberse al analizador YAML que utiliza Delayed_Job, pero no he probado esa opción mencionada por @Stefan Pettersson