2011-12-22 23 views
11

GÜNCELLEME: Bu soruna yönelik bir yama olmuş: https://github.com/collectiveidea/delayed_job/commit/023444424166ba2ce011bfe2d47954e79edf6798NoMethodError

GÜNCELLEME 2: herkes özellikle Heroku bu sorunla çalışan için, ben 0,8 Rake sürümüne indirmek buldum. 7 ve Gecikmeli İş sürümü 2.1.4'ü kullanırken gecikmeli iş v3'ü yapmaz (ancak yamada yerel olarak çalışır). Bu Bamboo-mri-1.9.2 yığınında.

Yerel olarak, bir 3.1.0 uygulamasında bir rayda delayed_job uygulamasını deniyorum. Ben göçü koştu ve mücevher dosyaları yüklü: collectiveidea github (https://github.com/collectiveidea/delayed_job) belgelere ardından

gem 'delayed_job' 
gem 'delayed_job_active_record' 

. aşağıdaki gibi benim denetleyicisinden gecikme çağrısı yapıyorum:

EventMailer.delay.event_message_email(current_user, @event_message) 

Bu görevi neden iş tabloya eklenecek ama tırmık işleri çalıştırdığınızda:

Class#event_message_email failed with NoMethodError: undefined method `event_message_email' for Class:Class - 6 failed attempts 
: çalışmak aşağıdaki hata günlükleri

SO üzerinde diğer delayed_job NoMethod hata sorularına baktım ama hiçbiri bu özel hatayı ele almıyor ya da buna bir çözüm sunmuyor. Collectiveidea sayfası teslim yöntemi çağrı olmadan bu biçimin Rails 3 postacıların nasıl kurulduğuna ilişkin bir saldırı olduğunu, bu yüzden belki de bu belgelerin bazı modası geçmiş olup olmadığını ve postacı yöntemlerini aramak için yeni bir yol olup olmadığını merak ediyorum bahseder?

Güncelleme: Ayrıca mailler yöntemini gecikme olmaksızın çağırmak gayet iyi çalışıyor ve varsayılan raylar sunucusunda çalıştırıyorum, dolayısıyla Collectiveidea faq'de belirtilen Thin ile ilgili sorun uygulanmıyor. Teşekkürler

+0

En son ne zaman 'komisyon işleri: çalışma' görevini yeniden başlattınız? Her kod değişikliğinden sonra yeniden başlatılması gerekiyor. – iwasrobbed

+0

EventMailer.event_message_email (current_user, @event_message) .delay.deliver çalışır mı? – Unixmonkey

+0

@iWasRobbed: Evet, bu işe yaramadı – tks

cevap

4

Bu sorunu, delayed_job (DJ) sürüm 2.1.2'ye geçerek giderdim.

kullanıyorum: rvm yakut 1.8.7 (2010-01-10 patchlevel 249) raylar 3.0.9

Gemfile: mücevher "delayed_job", '2.1.2'

o v3.0.0.pre

oldu benim için: '//github.com/collectiveidea/delayed_job.git git' : mücevher "delayed_job",: git => Bundan önce ben son delayed_job sürümünü kullanmaya çalıştı

Ancak: raylar d üretir elayed_job , geçişler dosyası oluşturmadı. Manuel olarak oluşturdum. Sonra 'rake db: migrate' sonra delayed_job kuyruğunu saklamak için tablo var. Ve sonra, tüm bunların doğru bir şekilde çalışması gerektiğini düşündüğümde, aynı hatayı aldım.

Bu hatanın kaynağını bulmaya çalıştığımda, 'delayed_jobs' tablosunda, delayed_job'nin görevlerinin yanlış şekilde kaydedildiğini buldum. İşte delayed_jobs 'tablosunda alan 'işleyicisi' dan snippet'tir:

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

Bildiğim kadarıyla delayed_job Struct sınıfının aracılığıyla tüm görevleri alır, böylece görev' başlığı isntead ait kaydedilmesi gerektiğine 'yakut/yapı!' !

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

ben konsolda sürecini delaed_job durdu Bunu kontrol etmek için: yakut/nesne' Burada doğru kaydedildiğinden görevin snippet'idir. Sonra DB için DJ görevi koymak için bazı yöntem seslendi:

Notifier.delay.some_email(current_user, @event_message) 

Sonra el 'işleyicisi' alanına '! Yakut/yapı' tarafından '! Yakut/nesne' yerini aldı. Daha sonra DJ 'rake işlerini başlattım: iş', postaların başarıyla gönderildiğini söyledi.

Ama: - bu görev DJ masasına silinmez değildi - ve posta Bu yüzden delayed_job yeni sürümünde bir hata olduğunu karar verdik alıcı

için almaz. DJ '2.1.2' ye geçtim ve benim için iyi çalıştı.

P.S. .: İngilizcemde :)

+0

merhaba yöntem çağrısı önce gecikme yerleştirilmesi gerektiğini söyleyerek yardımcı bir hata verir, upvoted. Değişimi masa alanına yaptım ve işi de temizledim, bu yüzden doğru olduğunu görüyorsun. Bunu github'da bir konu olarak açtım ve bunu bir referans olarak ekleyeceğim. Birkaç başka şeyi de denediğim için henüz 2.1.2'ye düşürmeyi denemedim ve bu durumun 3 postacıyla ilişkili sorunları çözmeyeceğinden endişe duyuyorum. – tks

+0

Sayfanın başı https://github.com/collectiveidea/delayed_job/issues/323 adresinden takip ediyorsanız, – tks

+1

Sukhoviy, selam, rotanıza gitmeye çalışıyorum ama o bundler'ı bulmaya izin vermiyor. delayed_job_active_record'un 3.0.0.pre öncesinde bir delayed_job sürümü ile kurulması. Delayed_job_active_record olmadan delayed_job 2.1.2'yi kullanmaya çalışmak da işe yaramıyor gibi görünmüyor. Buna bir çözüm bulabildin mi? Yoksa bırakıp resque kullanmalı mıyım? – tks

7

Mailer.delay.send_method Kullanımı için üzgünüm Raylar 3 (onlar docs bir hack değil söz) içinde arabası görünüyor. Aynı NoMethodError'a sahiptim ve dokümanlar içinde gösterilen işlerin yaratılması için alternatif bir yöntem kullanarak, yani bir gerçekleştirme yöntemiyle yeni bir Job sınıfı oluştururken çözdüm.

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

gecikme kullanmak yerine bunu yapmak için biraz daha uzun olduğunu ancak doğru iş yaratacak ve güvenilir onları işlemek gibi görünüyor:

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

Sonra benim denetleyicisi, işi oluşturun.

0

Sadece hızlı bir not. Bu sorunu yaşadım ve modelden bir değişken olan BEFORE_SAVE teslim yöntemine geçiyordum. AFTER_CREATE adresine geçiş yapmak sorunu benim için çözdü.

İlgili konular