2012-04-03 2 views
0

의 지연 작업이 나는 모델에 fbLikes를 계산 지연 작업을 할 필요가 있지만 "정의되지 않은 send_later() 메소드"의 오류보고가있다. 모델에서 내 fb_likes 함수에 지연된 작업을 수행 할 수있는 방법이 있습니까?루비 - 모델

============================== 최신 =============== ====================================

이 내 프로젝트에서 내 최신 코드입니다. 상황은 여전히 ​​동일하지만 fb_likes는 좋아요 수를 표시하지 않습니다.

[Company.rb] - 모델

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 

[구성/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

한가지 방법은를 생성하는 것이다 대기열에 들어갈 별도의 작업자, 업데이트 된 Model을 가져 와서 fb_likes 메서드를 호출하는 실행, 그러나 메서드는 public이어야합니다. 또는 논리를 작업자 자신에게 가져 가십시오.

+0

작업자가 컨트롤러 클래스를 의미합니까? –

+0

좀 더 확실한 예를 보여줄 수 있습니까? 내가 뭔가를 잘못 이해할 것 같아서 ... 고마워. –

+0

코드가 괜찮아 보인다 ... lib 디렉토리가 자동 로딩 경로에 있습니까? config.autoload_paths << File.join (config.root, "lib") –