2010-09-15 3 views
1

я получаю следующее сообщение об ошибке:Как отладить эту ошибку «нет метода» в рубине на рельсах?

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 

Это хрон задача, которая вызывает почтовую программу:

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

+0

Класс ContactEmail вновь создан, как описано выше, и модель выглядит следующим образом: # имя таблицы: contact_emails # # Идентификатор: целое число, не нулевой, первичный ключ # contact_id: целое число # email_id: целое # Статус: строка (255) # Заголовок: строка (255) # корпус: текст # DATE_CREATED: дата # date_sent: дата и время # created_at: дата и время # updated_at: DateTime # SugarCRM: логическое значение по умолчанию (FALSE) – Angela

ответ

1

Когда вы помещаете задержанное задание, он сериализует вовлеченные вещи (класс, имя метода hte, который вы вызываете на него, аргументы) в YAML, чтобы он мог вытащить их позже при запуске задания и работать с ними.

Похоже, что в вашем случае аргумент email не получает десериализован должным образом из YAML до того, как на него вызывается .subject.

Я обнаружил, что delayed_job имеет проблемы с сериализацией/десериализацией чего-либо, что не является простым сохраненным объектом ActiveRecord или примитивным типом (integer, string). Я всегда пытаюсь настроить вещи, поэтому объекты Job имеют только идентификаторы записей (целые числа), затем в методе выполнения, который я нахожу для объектов там и работаю с ними. Это, безусловно, позволит избежать неприятностей, которые вы видите.

+0

ахаха ... в то время как это объект activerecord, который я отправляю ... Я думаю, что вы правы в общем, что я должен передавать только целые числа, это интересная идея, которая могла бы LP .... – Angela

Смежные вопросы