2012-04-03 2 views
0

における遅延の仕事は、私がモデルでfbLikesをカウントするために遅れた仕事をする必要があるが、私は「未定義send_later()メソッド」のエラーレポートを持っています。モデルのfb_likes関数に遅延した仕事をする方法はありますか?ルビー - モデル

==============================最新=============== ====================================

これは私のプロジェクトで私の最新のコードです。状況は変わりませんが、fb_likesはお気に入り数を表示しません。

[Company.rb] -model

require "delayed_job" 
require "count_job.rb" 

class Company < ActiveRecord::Base 

before_save :fb_likes 

    def fb_likes    
     Delayed::Job.enqueue(CountJob.new(self.fbId)) 
    end  
end 

[CONFIG/LIB/count_job.rb]

class CountJob<Struct.new(:fbId) 
def perform 
    uri = URI("http://graph.facebook.com/#{fbId}") 
    data = Net::HTTP.get(uri) 
    self.fbLikes = JSON.parse(data)['likes'] 
end 
end 

[制御]

def create 
    @company = Company.new(params[:company]) 

    if @company.save! 
     flash[:success] = "New company successfully registered." 
    ----and other more code---- 
+0

を追加します。定義されていないsend_laterのスタックトレースを追加してください(何もこのメソッドを呼び出すべきではありません) – betamatt

+0

あなたの仕事の実行は、存在しない 'self.fbLikes'にも割り当てられています。ジョブ・クラスにはデータを保存することはできませんし、同様のデータをどこかに保存する必要があります。 – betamatt

答えて

3

デフォルトでは、ライブラリファイルは必要ありません。

  1. ジョブファイルの名前をcount_job.rbに変更します。ファイル名にcamelCaseを使用すると、予測できない方法であなたを傷つけるでしょう。
  2. あなたが前にいたよりも、あなたは今、別のエラーを説明している初期化子を作成し、require 'count_job.rb'
+0

私はすでに名前を変更していますが、問題は変わりません。私は私のポストに最新のコードを追加しました。 –

+0

私はこれ以上頭を痛めて何時間も過ごしました。私は、遅延した仕事が、作業者クラスを見つけていないときにDBから仕事を黙って削除していることを発見しました。イニシャライザにrequireステートメントを追加すると、問題が修正されました。ありがとう! – Santosh

0

一つの方法で作成することですキューに入れられる別のワーカー、更新されたモデルをフェッチしてそのfb_likesメソッドを呼び出す実行がありますが、メソッドは公開される必要があります。あるいは、論理を作業者自身に持ち込んでください。

+0

あなたはコントローラクラスを意味する作業者ですか? –

+0

私はより実例を教えてくれますか?私は何かを間違って誤解すると思います...ありがとう.. –

+0

あなたのコードは私にとってうまくいくようです...あなたのautoloadパスにlibディレクトリはありますか? config.autoload_paths << File.join(config.root、 "lib") –