Rails 4 – 如何从 NoMethodError 中解救并继续尝试方法?

Rails 4 – How to rescue from NoMethodError and continue trying method?

在我的联系人 class 中,在使用他们的电子邮件地址创建联系人后,我尝试从 FullContact 的 API 中提取尽可能多的联系人数据。

我遇到这个问题,如果 FullContact 中 "person" 的一列数据不存在,它会抛出一个 NoMethodError,我无法保存可能存在的其余数据联系人确实存在,因为我的方法在错误处停止。

如何从 NoMethodError 中解救出来并让我的方法继续 运行 其余部分?喜欢它跳过错误并尝试其余代码。我已经在我的救援代码中尝试了 nextcontinue,但这不起作用。

感谢您的帮助。

class Contact < ActiveRecord::Base  
  belongs_to :user

  after_create do |contact|
    contact.delay.update_fullcontact_data
  end

  def update_fullcontact_data

    person = FullContact.person(self.email) 

    if person.contact_info.given_name.present? 
      self.name = person.contact_info.given_name 
    end

    if person.contact_info.family_name.present? 
      self.last_name = person.contact_info.family_name
    end

    if person.demographics.location_general.present?
      self.city = person.demographics.location_general
    end

    save!

  rescue NoMethodError => exception
   puts "Hit a NoMethodError"
   save!
  end
end

一般来说,try 方法 (http://apidock.com/rails/Object/try) 可能是您问题的解决方案。简而言之 - 如果特定对象

上不存在方法,它 returns nil 而不是引发异常

如果你只是想确保它保存,你可以使用 ensure 做这样的事情:

class Contact < ActiveRecord::Base  
  belongs_to :user

  after_create do |contact|
    contact.delay.update_fullcontact_data
  end

  def update_fullcontact_data

    person = FullContact.person(self.email) 

    if person.contact_info.given_name.present? 
      self.name = person.contact_info.given_name 
    end

    if person.contact_info.family_name.present? 
      self.last_name = person.contact_info.family_name
    end

    if person.demographics.location_general.present?
      self.city = person.demographics.location_general
    end

    save!

  ensure
   save!
  end
end

更多信息: http://blog.rubybestpractices.com/posts/rklemme/003-The_Universe_between_begin_and_end.html