2011-12-22 17 views
11

UPDATE:有許多人針對此問題的補丁:https://github.com/collectiveidea/delayed_job/commit/023444424166ba2ce011bfe2d47954e79edf6798NoMethodError用的delayed_job(collectiveidea寶石)

更新2:對於任何運行到在Heroku這個問題而言,我發現降級到耙0.8。 7和使用延遲作業版本2.1.4工作,而延遲作業V3沒有(雖然與補丁它在本地工作)。這是在Bamboo-mri-1.9.2堆棧上。

我想在本地的rails 3.1.0應用程序上實現delayed_job。我跑的遷移和 安裝寶石文件:

gem 'delayed_job' 
gem 'delayed_job_active_record' 

繼上collectiveidea github上(https://github.com/collectiveidea/delayed_job)的文檔。我從我的控制器使得延遲電話如下:

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郵件程序是一種破解,所以我想知道這個文檔是否可能有些過時,並且如果有一種新的方法稱爲郵件程序方法?

更新:也毫無延遲地調用郵件方法工作正常,我在默認的rails服務器上運行它,所以在collectiveidea faq中提到的Thin問題不適用。謝謝

+0

您最後一次重新啓動「rake jobs:work」任務是什麼時候?它需要在每次代碼更改後重新啓動。 – iwasrobbed 2011-12-22 16:56:38

+0

EventMailer.event_message_email(current_user,@event_message).delay.deliver是否有效? – Unixmonkey 2011-12-25 20:56:35

+0

@iWasRobbed:是的,我已經試過了 – tks 2011-12-27 02:14:24

回答

4

我通過切換到delayed_job(DJ)版本2.1.2解決了這個問題。

我使用: RVM 紅寶石1.8.7(2010-01-10 PATCHLEVEL 249) 軌3.0.9

的Gemfile: 寶石 「的delayed_job」, '2.1.2'

在此之前我嘗試使用最新版本的delayed_job的: 寶石「的delayed_job」:混帳=>「混帳://github.com/collectiveidea/delayed_job.git」 對我來說是v3.0.0.pre

但是: 導軌生成d 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過程中控制檯。然後我打電話一些方法把DJ的任務是DB:

Notifier.delay.some_email(current_user, @event_message) 

然後我手動在「處理」場「!紅寶石/結構」取代「紅寶石/對象!」。 然後我開始了DJ'耙工作:工作',它說我郵件成功發送了。

但是: - 這項任務不能從DJ的桌子 刪除 - 和郵件沒有到達收件人

所以我決定,這是在delayed_job的新版本中的錯誤。我切換到DJ'2.1.2',這對我很好。

P.S:對不起,我的英語:)

+0

之前,感謝詳細的評估,upvoted。我對錶格字段進行了更改,並且還清除了作業,看起來您是正確的。我在github上將其作爲一個問題打開,並將其添加爲參考。我還沒有嘗試降級到2.1.2,因爲我正在嘗試一些其他的事情,我擔心這不會解決與rails 3郵件程序相關的問題。 – tks 2011-12-27 02:43:26

+0

順便問題是在https://github.com/collectiveidea/delayed_job/issues/323如果你想跟着它 – tks 2011-12-27 02:55:54

+1

Sukhoviy,嗨,試圖走你的路線,但發現捆綁商不允許使用3.0.0.pre之前的delayed_job版本安裝delayed_job_active_record。嘗試使用delayed_job 2.1.2而不使用delayed_job_active_record似乎也不起作用。你能解決這個問題嗎?或者我應該放下它並使用resque :)? – tks 2011-12-29 15:47:57

7

使用Mailer.delay.send_method似乎在Rails 3中(他們提到它在文檔黑客攻擊)越野車。我有相同的NoMethodError,並通過使用替代方法來創建文檔中顯示的作業,即使用執行方法創建新的Job類來解決它。

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

然後創建工作,在我的控制器:

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

它稍長做到這一點比使用延遲,但它似乎正確地創建工作和可靠地處理它們。

0

只是一個簡短的說明。我遇到了這個問題,這是因爲我將模型中的變量傳遞給了傳遞方法BEFORE_SAVE。切換到AFTER_CREATE解決了我的問題。

相關問題