2010-09-15 54 views
1

我收到以下錯誤:如何在rails上調試ruby中的'no method'錯誤?

Delayed::Job SomeMailJob# (NoMethodError) "undefined method `subject' for #<YAML::Object:0x2b0a191f4c78>" 

這來自於以下幾個代碼引用上面的SombMailJob:

class SomeMailJob < Struct.new(:contact, :contact_email) 
    def perform 
    OutboundMailer.deliver_campaign_email(contact,contact_email) 
    end 
end 

這裏是郵件:

class OutboundMailer < Postage::Mailer 

    def campaign_email(contact,email) 
    subject email.subject 
    recipients contact.email 
    from  'me.com>' 
    sent_on Date.today 

    body  :email => email 
    end 

這是cron的調用郵件程序的任務:

Contact.all.each do |contact| 
    email = contact.email_today #email_today is a contact method returning email object if <= today 

    unless contact.email_today == "none" || email.nil? 
    puts "contact info inside cron job" 
    puts contact.first_name 
    puts email.days 
    puts contact.date_entered 
    puts contact.colleagues 
    puts "substituted subject:" 
    puts email.substituted_subject(contact,contact.colleagues) 

    # create the Contact Email object that gets created and sent 

    contact_email = ContactEmail.new 
    contact_email.contact_id = contact.id 
    contact_email.email_id = email.id 

    contact_email.subject = email.substituted_subject(contact,contact.colleagues) 


    puts contact_email.subject 

    contact_email.date_sent = Date.today 
    contact_email.date_created = Date.today 

    contact_email.body = email.substituted_message(contact, contact.colleagues) 

    contact_email.status = "sent" 

    #Delayed::Job.enqueue OutboundMailer.deliver_campaign_email(contact,contact_email) 
    Delayed::Job.enqueue SomeMailJob.new(contact,contact_email) 

    contact_email.save #now save the record 

問題:爲什麼我得到這個錯誤?我甚至不知道對象是什麼,因爲它提供了代碼,所以我不能進一步深入調試。

+0

你的'ContactEmail'類是什麼樣的?如上所述新創建 – Codebeef 2010-09-15 16:07:20

+0

的ContactEmail類和模型看起來像這樣:#表名:contact_emails # #標識:整數不爲空,主鍵 #CONTACT_ID:整數 #EMAIL_ID:整數 #狀態:字符串( 255) #主題:字符串(255) #體:文字 #DATE_CREATED:日期 #DATE_SENT:日期時間 #created_at:日期時間 #的updated_at:日期時間 #SugarCRM的:布爾默認值(FALSE) – Angela 2010-09-16 00:49:16

回答

1

當您排隊延遲作業時,它會將涉及的內容(類,您調用的對象的名稱,參數)序列化到YAML中,以便稍後在運行作業時將其拉出;以及與他們合作。

它看起來像你的情況下,email參數沒有從YAML正確得到反序列化,然後.subject被調用。

我發現delayed_job往往會在序列化/反序列化不是簡單存儲的ActiveRecord對象或基元類型(整型,字符串)的任何東西時遇到問題。我總是試圖設置一些東西,所以我的Job對象只需要記錄ID(整數),然後在執行方法中找到那裏的對象並使用它們。這肯定會避免你看到的麻煩。

+0

AHAH ...而它是我發送的一個主動記錄對象....我認爲你一般來說是正確的,我應該只傳遞整數,這是一個有趣的想法,可以讓他LP .... – Angela 2010-09-30 22:22:40

相關問題