2011-12-22 16 views
11

ACTUALIZACIÓN: Ha habido un parche para este problema: https://github.com/collectiveidea/delayed_job/commit/023444424166ba2ce011bfe2d47954e79edf6798NoMethodError con delayed_job (joya collectiveidea)

ACTUALIZACIÓN 2: Para cualquier persona corriendo en este tema en Heroku específicamente, he encontrado la degradación hasta Rastrillo 0.8. 7 y el uso de tareas retrasadas versión 2.1.4 funciona, mientras que el trabajo retrasado v3 no lo hace (aunque con el parche funciona en local). Esto está en la pila Bamboo-mri-1.9.2.

Estoy tratando de implementar delayed_job en una aplicación de rails 3.1.0 localmente. Me encontré con la migración y instalado los archivos de la gema:

gem 'delayed_job' 
gem 'delayed_job_active_record' 

Después de la documentación sobre el github collectiveidea (https://github.com/collectiveidea/delayed_job). Estoy haciendo la llamada retraso de mi controlador de la siguiente manera:

EventMailer.delay.event_message_email(current_user, @event_message) 

Esto hace que la tarea que se añade a la mesa de trabajo, pero cuando corro puestos de trabajo del rastrillo: trabajar registra el siguiente error:

Class#event_message_email failed with NoMethodError: undefined method `event_message_email' for Class:Class - 6 failed attempts 

He consultado las otras preguntas de error de retardo_trabajo NoMethod en SO, pero ninguna soluciona este error específico ni proporciona una solución. La página collectiveidea menciona que este formato sin la llamada al método de entrega es un truco para la configuración de los envíos de Rails 3, por lo que me pregunto si esta documentación puede estar un poco desactualizada y si existe una nueva forma de llamar a los métodos de envío por correo.

Actualización: también llama al método de envío de correo sin demoras funciona bien, y lo estoy ejecutando en el servidor de rieles predeterminado por lo que el problema con Thin mencionado en el colectivo faq preguntas no se aplica. Gracias

+0

cuándo fue la última vez que se reinicia sus 'puestos de trabajo del rastrillo: work' tarea? Es necesario reiniciar después de cada cambio de código. ¿El – iwasrobbed

+0

EventMailer.event_message_email (current_user, @event_message) .delay.deliver trabajo? – Unixmonkey

+0

@iWasRobbed: sí, lo he intentado – tks

Respuesta

4

He solucionado este problema al cambiar a la versión 2.1.2 de la versión demoda (DJ).

estoy usando: RVM rubí 1.8.7 (2010-01-10 Patchlevel 249) rieles 3.0.9

Gemfile: joya "delayed_job", '2.1.2'

antes de esto he tratado de usar la versión más reciente de delayed_job: joya "delayed_job",: git => 'git: //github.com/collectiveidea/delayed_job.git' para mí fue v3.0.0.pre

Pero: rieles generan d elayed_job no generó el archivo de migraciones. Lo creé manualmente Luego, después de 'rake db: migrate', tengo la tabla para almacenar la cola delayed_job. Y luego, cuando pensaba que todo debía funcionar correctamente, tuve el mismo error.

Cuando traté de encontrar el origen de este error, en la tabla 'delayed_jobs' encontré que las tareas delayed_job están incorrectamente guardadas. Aquí es fragmento del campo 'manipulador' de la tabla 'delayed_jobs':

--- !ruby/object:Delayed::PerformableMailer 
object: !ruby/class Notifier 

Como sé, delayed_job obtiene todas las tareas a través de la clase Struct, lo que la tarea debe ser guardado con cabecera isntead de ' 'rubí/struct!' !rubí/objeto' Aquí está el fragmento de tarea guardado correctamente:

--- !ruby/struct:Delayed::PerformableMailer 
object: !ruby/class Notifier 

Para comprobar esto dejé de delaed_job proceso en la consola. Entonces llamé a algún método para poner la tarea del DJ para DB:

Notifier.delay.some_email(current_user, @event_message) 

Volví a colocar manualmente 'rubí/objeto!' Por 'ruby/struct' en el campo 'manipulador'. Luego comencé DJ's 'rake jobs: work', me dijo que el correo se envió con éxito.

Pero: - esta tarea no se eliminará de la tabla de DJ - y el correo no llega al destinatario

Así que he decidido que es un error en la nueva versión de delayed_job. Cambié a DJ '2.1.2' y me funcionó bien.

P.S .: Lo siento por mi Inglés :)

+0

Hola, gracias por la evaluación detallada, upvoted. Hice el cambio en el campo de la tabla y también borró el trabajo, por lo que parece que estás en lo cierto. Abrí esto como un problema en el github y lo agregaré como referencia. Todavía no he intentado degradar a 2.1.2, ya que estoy probando un par de cosas más, y me preocupa que esto no resuelva los problemas asociados con los envíos de correos de Rails 3. – tks

+0

Por cierto, el problema está en https://github.com/collectiveidea/delayed_job/issues/323 si desea seguir – tks

+1

Sukhoviy, hola, tratando de pasar su ruta pero al ver que bundler no está permitiendo el instalar de delayyed_job_active_record con una versión de delayyed_job anterior a 3.0.0.pre. Intentar utilizar el método demored_job 2.1.2 sin retaryed_job_active_record tampoco parece funcionar. ¿Pudiste encontrar una solución a esto? ¿O debería simplemente soltarlo y usar resque :)? – tks

7

Usando Mailer.delay.send_method parece cochecito en Rails 3 (que mencionar que es un corte en la documentación). Tuve el mismo NoMethodError y lo resolví utilizando el método alternativo para crear trabajos que se muestra en los documentos, es decir, crear una nueva clase de trabajo con un método de ejecución, p.

class UserMailerJob < Struct.new(:text, :email) 
    def perform 
    UserMailer.your_mailer_method(text, email).deliver 
    end 
end 

A continuación, para crear el trabajo, en mi controlador:

Delayed::Job.enqueue UserMailerJob.new(@text, @email) 

Es un poco más largo para hacer esto que el uso de retraso pero parece crear los puestos de trabajo correcta y procesarlos de forma fiable.

0

Sólo una nota rápida. Tuve este problema y fue porque estaba pasando una variable del modelo al método de entrega BEFORE_SAVE. Cambiar a AFTER_CREATE me solucionó el problema.

Cuestiones relacionadas