2013-08-29 17 views
6

Eşzamansız olarak ele almak istediğim bir denetleyici eylemim var. TypeError: Bunun adıRaylar 3 delayed_job "TypeError: anonim modül dökümü yapamaz"

class CollectionsController < ApplicationController 
    def add 
    #code 
    end 
    handle_asynchronously :add 

Şey alabilir anonim modülünü

delayed_job dokümantasyon yöntemi bir ActiveRecord modeli yöntemi olmak zorunda olmadığı net değildir dökümü olamaz. İnsanların bunu işlemek için başka sınıflar kullandığı örnekleri gördüm, ancak yöntemim oturum bilgilerini kullanıyor. Bu bilginin başka bir sınıfa hazır olup olmayacağı belli değil.

Herhangi bir fikrin var mı?

Teşekkürler.

+0

Buradan cevaba bakın: http://stackoverflow.com/questions/12956661/controller-action-to-delayed-job – fatfrog

cevap

8

Gecikmeli işler, bir düz eski Ruby sınıfına işlevler ekleyebilirsiniz, bir ActiveRecord modeli olmak zorunda Muhtemelen kontrolör eylem bu olduğu gibi Zaman uyumsuz olarak işlenecek istemiyoruz https://github.com/collectiveidea/delayed_job#custom-jobs

görmüyorum HTTP isteğine gereksiz bir gecikme ekleyin. Benim tavsiyem şöyle denetleyici bir iş sıraya olacaktır:

class CollectionsController < ApplicationController 
    def add 
    Delayed::Job.enqueue CollectionBuilderJob.new(@current_user.session_info) 
    end 
end 

class CollectionBuilderJob < Struct.new(:session_info) 
    def perform 
    #code 
    end 
end 

Bu yaklaşım bir denetleyici yöntemine DJ kullanamaz izolasyon

5

da gecikmiş işi test etmenizi sağlar. Bir modele taşıyın.

+2

Cevabınızı neden bu kadar genişletebilir misiniz? Doğru olana benziyor. Ayrıca, neden sadece bir modele yerleştirin? Neden statik bir singleton değil? – vedant1811

+0

Yönteminizi bir sınıf yöntemi yaparsanız, buraya bakın: http://stackoverflow.com/questions/12956661/controller-action-to-delayed-job – fatfrog