2011-10-25 1 views
1

は私の小さなRails3コントローラです:delayed_job:NoMethodErrorここ

class HomeController < ApplicationController 
    def index 
    HomeController.delay.do_stuff 
    end 
    def self.do_stuff 
    puts "Hello" 
    end 
end 

indexにアクセスすると、ジョブが正常にデータベースに挿入されます:

--- !ruby/struct:Delayed::PerformableMethod 
object: !ruby/object:Class HomeController 
method_name: :do_stuff 

問題:bundle exec rake jobs:workを実行し、私が取得します:

Class#do_stuff failed with NoMethodError: 
    undefined method `do_stuff' for #<Class:0x0000000465f910> 

HomeController.do_stuffが完璧に機能しているにもかかわらず。何か案が?

答えて

2

https://github.com/collectiveidea/delayed_job/wiki/Common-problems#wiki-undefined_method_xxx_for_classを参照してください。

あなたが、データベース内の

..object: !ruby/class HomeController method_name ...

を持つべきであると思われますが、あなたの代わりに

..object: !ruby/object:Class HomeController method_name ...

を持っています。どちらが悪いですか。

投稿者delayed_jobでも理由はわかりません。それはどういうわけか、あなたが走っているウェブサーバに依存します。 wikiの推奨をお試しください。

+1

で言及されているオプションを試していないYAMLパーサのもあるかもしれません問題、たくさんありがとう! –

+1

あなたの答えはまた、私の賞金の質問を解決します:http://stackoverflow.com/questions/7845874そこに回答を投稿してください(例えばここにリンクするだけです)、私はあなたに賞金を授与します:-) –

+0

@Nicolas Raoul素晴らしい、ありがとう。私はそこにそれをコピーした。 – Petr

0

私は同じ問題を抱えていました。

ジョブがWebアプリケーションによってキューに置かれたときと、後で実行されたときに、異なるyamlパーサーが使用されていることを示すいくつかの議論がありました。

一部の人は、精神分析者を使用する必要があることを示唆しています。いくつかはsyckを示唆している。まず私は心理学を試みたが、他の宝石との互換性の問題で終わった。だから私はsyckを選んだ。

Webサーバーとキューで使用されている構成ファイルを並べ替えることができませんでした。私は、次の構成(それらのすべてのファイルの先頭にある)になってしまった多くの実験後:

#application.rb 
require File.expand_path('../boot', __FILE__) 

require 'rails/all' 
require 'yaml' 
YAML::ENGINE.yamler= 'syck' 
# ... 

#environment.rb 
require 'yaml' 
YAML::ENGINE.yamler= 'syck' 
# ... 

#boot.rb 
require 'yaml' 
YAML::ENGINE.yamler= 'syck' 
require 'rubygems' 
# ... 

アイムRuby 1.9.3、Rails 3.2.8、Webrick、delayed_job 3.0.3

0

私の場合、問題は主に私が合格したためでしたdelayed_jobキューに渡されたオブジェクトのパラメータとしてHashを使用します。 しかし、25回のトレイルの後、私はdelayed_jobがパラメータとしてintegerを持つオブジェクトだけを受け入れると結論づけました。したがって、データベースにすべてのパラメータを格納し、そのレコードIDをパラメータとしてdelayed_jobに渡し、実行関数内でそのレコードIDを持つすべてのパラメータにアクセスし、そのデータをフェッチした後にそのレコードを削除できます。

Delayed::Job.enqueue LeadsJob.new(params[:customer]) # this job will be queued but will never run, this is because of the way Delayed_job serializes and De-serializes the objects. 

顧客の詳細は、ちょうどその関数の中でそのレコードを削除するパラメータを渡すことだった場合は、代わりにこの

@customer = Customer.create(params[:customer]) 
Delayed::Job.enqueue LeadsJob.new(@customer.id) 

ような何かを行います。

詳細については、私にpingしてください。

問題は、Delayed_Jobを使用していますが、私は私のIDEのサーバーが解決server`の代わりに、 `レールを実行し、実際@Stefanペターソン