【问题标题】:How do I debug this 'no method' error in ruby on rails?如何在 ruby​​ on rails 中调试此“无方法”错误?
【发布时间】:2011-04-12 18:46:25
【问题描述】:

我收到以下错误:

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

问题:为什么会出现这个错误?我什至不知道该对象是什么,因为它正在编写代码,所以我无法真正深入调试。

【问题讨论】:

  • 你的“ContactEmail”类是什么样的?
  • ContactEmail 类是如上所述新建的,模型如下所示: # Table name: contact_emails # # id :integer not null, primary key # contact_id :integer # email_id :integer # status : string(255) # subject :string(255) # body :text # date_created :date # date_sent :datetime # created_at :datetime # updated_at :datetime # sugarcrm :boolean default(FALSE)

标签: ruby-on-rails methods object cron delayed-job


【解决方案1】:

这对我有用。似乎与您遇到的问题相同。

Rails Delayed Job & Library Class

【讨论】:

    【解决方案2】:

    当您将延迟的作业排入队列时,它会将所涉及的内容(类、您调用的 hte 方法的名称、参数)序列化到 YAML 中,以便稍后在运行作业时将它们取出并使用他们。

    在您的情况下,email 参数在调用 .subject 之前似乎没有从 YAML 正确反序列化。

    我发现delayed_job 往往难以序列化/反序列化任何不是简单存储的ActiveRecord 对象或原始类型(整数、字符串)的东西。我总是尝试进行设置,以便我的 Job 对象只获取记录 ID(整数),然后在 perform 方法中我找到那里的对象并使用它们。这绝对可以避免您遇到的麻烦。

    【讨论】:

    • 啊……虽然它是我要发送的 activerecord 对象……但我认为您通常是对的,我应该只传递整数,这是一个有趣的想法,可能会有所帮助……
    猜你喜欢
    • 2014-11-19
    • 2022-10-23
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多