Как отладить эту ошибку 'no method' в ruby ​​on rails? - PullRequest
1 голос
/ 15 сентября 2010

Я получаю следующую ошибку:

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

Вопрос: почему я получаю эту ошибку?Я даже не знаю, что это за объект, потому что он подходит к коду, поэтому я не могу продолжить детализацию для отладки.

Ответы [ 2 ]

2 голосов
/ 20 марта 2011

Это сработало для меня.Кажется, это та же проблема, что и у вас.

Rails Delayed Job & Library Class

1 голос
/ 30 сентября 2010

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

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

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

...