2013-08-29 20 views
6

我有一個控制器操作,我想異步處理。Rails 3 delayed_job「TypeError:無法轉儲匿名模塊」

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

當這個被稱爲我得到一個: 類型錯誤:無法轉儲匿名模塊

的delayed_job的文檔不清晰的方法是否是一個ActiveRecord模型的方法。我看過一些例子,人們使用其他類來處理這個問題,但是我的方法使用會話信息。我不清楚這些信息是否會提供給另一個班級。

任何想法?

謝謝。

+0

請參閱這裏的答案:http://stackoverflow.com/questions/12956661/controller-action-to-delayed-job – fatfrog

回答

8

延遲作業沒有成爲一個ActiveRecord模型,您可以將功能添加到一個普通的舊Ruby類,見https://github.com/collectiveidea/delayed_job#custom-jobs

你可能不希望控制器動作來進行異步處理,因爲這會爲HTTP請求添加不必要的延遲。我的建議是要排隊的控制工作,像這樣:

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 

這種方法可以讓你測試你的延遲工作在隔離

5

你不能在一個控制器方法使用的DJ。將其移入模型中。

+2

你能擴展你的答案爲什麼是這樣嗎?這似乎是正確的。另外,爲什麼只把它放在模型中?爲什麼不是一個靜態單身人士? – vedant1811

+0

你可以,如果你讓你的方法一個類的方法,請看這裏:http://stackoverflow.com/questions/12956661/controller-action-to-delayed-job – fatfrog