2011-12-22 3 views
11

UPDATE: C'è stata una patch per questo problema: https://github.com/collectiveidea/delayed_job/commit/023444424166ba2ce011bfe2d47954e79edf6798NoMethodError con delayed_job (gemma collectiveidea)

UPDATE 2: Per chiunque incorrere in questo problema in Heroku particolare, ho trovato il downgrade a Rake 0.8. 7 e utilizza la versione 2.1 del lavoro ritardato, mentre il lavoro ritardato v3 non lo fa (anche se con la patch funziona su locale). Questo è nello stack Bamboo-mri-1.9.2.

Sto provando a implementare delayed_job su un'app rails 3.1.0 localmente. Ho eseguito la migrazione e installato i file di gemme:

gem 'delayed_job' 
gem 'delayed_job_active_record' 

In seguito la documentazione sul github collectiveidea (https://github.com/collectiveidea/delayed_job). Sto facendo la chiamata ritardo dal mio regolatore come segue:

EventMailer.delay.event_message_email(current_user, @event_message) 

Questo fa sì che il compito da aggiungere alla tabella di lavoro, ma quando ho eseguito lavori di rake: il lavoro viene registrato il seguente errore:

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

Ho esaminato le altre domande di errore NoMethod di delayed_job su SO, ma nessuna risolve questo errore specifico o ne fornisce una soluzione. La pagina collettiva dice che questo formato senza la chiamata al metodo di consegna è un trucco per come sono impostati i mailer di Rails 3, quindi mi chiedo se forse questa documentazione potrebbe essere obsoleta e se c'è un nuovo modo di chiamare i metodi mailer?

Aggiornamento: anche chiamare il metodo mailer senza ritardi funziona bene, e lo sto eseguendo sul server di rail predefinito in modo che il problema con Thin menzionato nella FAQ di collective non si applica. Grazie

+0

Quando è l'ultima volta che è stato riavviato il task 'rake jobs: work'? Ha bisogno di essere riavviato dopo ogni cambio di codice. – iwasrobbed

+0

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

+0

@iWasRobbed: sì, ho provato che – tks

risposta

4

Ho risolto questo problema passando a delayed_job (DJ) versione 2.1.2.

sto usando: rvm ruby ​​1.8.7 (2010-01-10 patchlevel 249) rotaie 3.0.9

Gemfile: gioiello "delayed_job", '2.1.2'

prima di questo ho cercato di usare l'ultima versione di delayed_job: gemma "delayed_job",: git => 'git: //github.com/collectiveidea/delayed_job.git' per me è stato v3.0.0.pre

Ma: le rotaie generano d elayed_job non ha generato il file di migrazione. L'ho creato manualmente. Quindi dopo 'rake db: migrate' ho la tabella per l'archiviazione della coda delayed_job. E poi, quando stavo pensando che tutto deve funzionare correttamente, ho lo stesso errore.

Quando ho cercato di trovare l'origine di questo errore, nella tabella 'delayed_jobs' ho trovato che le attività di delayed_job sono state salvate in modo errato. Ecco frammento dal campo 'handler' nella tabella 'delayed_jobs':

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

Per quanto ne so, delayed_job ottiene tutte le attività attraverso classe Struct, in modo che il compito dovrebbe essere salvato con un colpo di testa isntead di ' 'ruby/struct!' !ruby/oggetto' Ecco il frammento di compito salvato correttamente:

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

di controllare questo mi sono fermato delaed_job processo in consolle. Poi ho chiamato un metodo per mettere compito di DJ per DB:

Notifier.delay.some_email(current_user, @event_message) 

Poi ho sostituito manualmente 'ruby/oggetto!' Da 'ruby/struct!' Nel campo 'handler'. Poi ho iniziato i lavori di rake di DJ: lavoro, mi ha detto che la posta è stata inviata con successo.

Ma: - questo compito non è stato eliminato dal tavolo di DJ - e la posta non ottiene al destinatario

Così ho deciso che si tratta di un bug nella nuova versione di delayed_job. Sono passato a DJ "2.1.2" e ha funzionato bene per me.

P.S .: Ci dispiace per il mio inglese :)

+0

ciao, grazie per la valutazione dettagliata, con voto positivo. Ho apportato la modifica al campo della tabella e ha anche cancellato il lavoro, quindi sembra che tu abbia ragione. L'ho aperto come problema sul github e lo aggiungeremo come riferimento. Non ho ancora provato il downgrade alla 2.1.2, poiché sto provando anche un paio di altre cose, e sono preoccupato che questo non risolva i problemi associati ai mailer di rails 3. – tks

+0

A proposito il problema è https://github.com/collectiveidea/delayed_job/issues/323 se desideri seguirlo – tks

+1

Sukhoviy, ciao, provando a percorrere la tua rotta ma trovando che il bundler non consente il installazione di delayed_job_active_record con una versione di delayed_job precedente alla 3.0.0.pre. Anche il tentativo di usare delayed_job 2.1.2 senza delayed_job_active_record sembra non funzionare. Sei riuscito a ottenere una soluzione a questo? O dovrei semplicemente lasciarlo e usare resque :)? – tks

7

Utilizzando Mailer.delay.send_method sembra buggy in Rails 3 (accennano è un hack nella documentazione). Ho avuto lo stesso NoMethodError e l'ho risolto usando il metodo alternativo per creare i lavori mostrati nei documenti, ovvero creare una nuova classe Job con un metodo perform, ad es.

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

Poi per creare il lavoro, nel mio controller:

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

E 'un po' più tempo per fare questo che usando ritardo ma sembra per creare i posti di lavoro in modo corretto ed elaborarli in modo affidabile.

0

Solo una breve nota. Ho avuto questo problema ed è stato perché stavo passando una variabile dal modello al metodo di consegna BEFORE_SAVE. Passare a AFTER_CREATE ha risolto il problema per me.