2011-12-22 5 views
11

UPDATE :이 문제에 대한 패치가있었습니다 : https://github.com/collectiveidea/delayed_job/commit/023444424166ba2ce011bfe2d47954e79edf6798NoMethodError

업데이트 2 : 사람이 특별히에게 Heroku에서이 문제에 실행, 나는 0.8을 긁어 다운 그레이드 발견했습니다. 7이고 Delayed Job 버전 2.1.4를 사용하는 반면 지연된 작업 v3은 그렇지 않습니다 (패치는 로컬에서 작동 함). 이것은 Bamboo-mri-1.9.2 스택에 있습니다.

로컬로 레일스 3.1.0 앱에 delayed_job을 구현하려고합니다. 나는 마이그레이션을 실행하고 는 보석 파일을 설치하십시오 collectiveidea의 GitHub의 (https://github.com/collectiveidea/delayed_job)에 대한 설명서에 따라

gem 'delayed_job' 
gem 'delayed_job_active_record' 

합니다. 다음과 같이 내 컨트롤러에서 지연 호출을하고있다 :

EventMailer.delay.event_message_email(current_user, @event_message) 

이 작업의 원인이 작업 테이블에 추가 할하지만 난 레이크 작업을 실행하면

Class#event_message_email failed with NoMethodError: undefined method `event_message_email' for Class:Class - 6 failed attempts 
: 작업을 다음과 같은 오류를 기록

나는 다른 delayed_job NoMethod 오류 질문을 봤지만 아무도이 특정 오류를 해결하거나 해결 방법을 제공하지 않습니다. collectiveidea 페이지는 전달 메소드 호출이없는이 형식이 Rails 3 메일러가 어떻게 설정되어 있는지에 대한 해킹이라고 언급했기 때문에이 문서가 시대에 뒤떨어 졌는지, 메일러 메소드를 호출하는 새로운 방법이 있는지 궁금합니다.

업데이트 : 지연없이 메일러 메소드를 호출하는 것이 좋습니다. collectiveidea faq에 언급 된 Thin 문제가 적용되지 않도록 기본 레일즈 서버에서 실행 중입니다. 감사합니다.

+0

'rake jobs : work' 작업을 마지막으로 다시 시작한 시점은 언제입니까? 모든 코드를 변경 한 후에 다시 시작해야합니다. – iwasrobbed

+0

EventMailer.event_message_email (current_user, @event_message) .delay.deliver가 작동합니까? – Unixmonkey

+0

@iWasRobbed : 예, 시도했습니다. – tks

답변

4

delayed_job (DJ) 버전 2.1.2로 전환하여이 문제를 해결했습니다.

내가 사용하고 있습니다 : RVM 루비 1.8.7 (2010-01-10 패치 레벨 249) 레일 3.0.9

Gemfile : 보석 "delayed_job ','2.1.2 '

이 v3.0.0.pre

이었다 나를 위해 '//github.com/collectiveidea/delayed_job.git 자식' : 보석 "delayed_job": 자식 =>이 전에 나는 최신 delayed_job의 버전을 사용하려

하지만 : 레일이 생성됩니다. elayed_job 마이그레이션 파일이 생성되지 않았습니다. 나는 그것을 수동으로 만들었다. 그런 다음 'rake db : migrate'이후에 delayed_job 큐를 저장하기위한 테이블을 얻었습니다. 그리고 나서, 모든 것이 올바르게 작동해야한다고 생각할 때, 나는 똑같은 오류가 있습니다.

이 오류의 원인을 찾으려고 할 때 'delayed_jobs'테이블에서 delayed_job의 작업이 잘못 저장되었다는 것을 발견했습니다. 여기 delayed_jobs '테이블 필드'핸들러 '에서 조각입니다 :

--- !ruby/object:Delayed::PerformableMailer 
object: !ruby/class Notifier 

내가 알기로는, delayed_job이 구조체 클래스를 통해 모든 작업을 얻는다, 그래서 작업은'헤더 isntead의로 저장해야합니다 '루비/구조체!' !

--- !ruby/struct:Delayed::PerformableMailer 
object: !ruby/class Notifier 

내가 콘솔 과정을 delaed_job 중단이를 확인하려면 : 루비/오브젝트 ' 다음은 올바르게 저장 작업의 조각입니다. 그럼 DB에 DJ의 작업을 넣어 몇 가지 방법을 전화 :

Notifier.delay.some_email(current_user, @event_message) 

그럼 내가 수동으로 '핸들러'분야에서 '! 루비/구조체'에 의해 '! 루비/객체를'대체했다. 그런 다음 DJ 'rake jobs : work'를 시작했습니다. 메일이 성공적으로 전송되었다고 말했습니다.

그러나 : -이 작업은 DJ의 테이블 에서 삭제되지 않았습니다 - 메일 그래서 나는 그것이 delayed_job의 새 버전에서 문제를 결정했습니다 수신자

에 도착하지 않습니다. 나는 DJ '2.1.2'로 전환했는데 잘 돌아갔다.

P.S : 내 영어 :

+0

안녕하세요, 자세한 평가에 감사드립니다. upvoted. 테이블 필드를 변경하고 작업이 취소되어 사용자가 올바른 것으로 보입니다. github에서이 문제를 열어 이것을 참조로 추가 할 것입니다. 아직 다른 몇 가지 시도를하고 있기 때문에 아직 2.1.2로 다운 그레이드를 시도하지 않았으며 레일 3 우편물과 관련된 문제는 해결되지 않을 것이라고 우려하고 있습니다. – tks

+0

그런데 문제점을 https://github.com/collectiveidea/delayed_job/issues/323에서 확인하고 싶다면 – tks

+1

Sukhoviy, 안녕하세요, 경로를 찾으려고하지만 해당 번들러가 3.0.0.pre 이전에 delayed_job 버전으로 delayed_job_active_record를 설치하십시오. delayed_job_active_record없이 delayed_job 2.1.2를 사용하려고 시도하는 것도 효과가없는 것으로 보입니다. 이 문제를 해결할 수 있었습니까? 아니면 그냥 그것을 삭제하고 resque를 사용해야합니까 :)? – tks

7

Mailer.delay.send_method을 사용하여 죄송 레일 3 (그들이이 문서에서 해킹 언급)에 버그를 보인다. 나는 동일한 NoMethodError를 가지며 문서에 표시된 작업을 생성하는 대체 방법을 사용하여 해결했습니다. 즉 수행 메소드로 새 작업 클래스를 생성합니다.

Delayed::Job.enqueue UserMailerJob.new(@text, @email) 

지연을 사용하는 것보다 이렇게 약간 이상입니다하지만 제대로 일자리를 창출하고 안정적으로 그들을 처리 할 것 같다

class UserMailerJob < Struct.new(:text, :email) 
    def perform 
    UserMailer.your_mailer_method(text, email).deliver 
    end 
end 

그런 다음 내 컨트롤러에서 작업을 만들 수 있습니다.

0

빠른 메모. 이 문제는 모델에서 BEFORE_SAVE 전달 메소드로 변수를 전달했기 때문에 발생했습니다. AFTER_CREATE (으)로 전환하면 문제가 해결되었습니다.