Ruby on rails 轨道4和x2013;如何从命名错误中拯救并继续尝试方法?

Ruby on rails 轨道4和x2013;如何从命名错误中拯救并继续尝试方法?,ruby-on-rails,ruby,activerecord,rescue,Ruby On Rails,Ruby,Activerecord,Rescue,在我的Contacts类中,在使用联系人的电子邮件地址创建联系人后,我尝试从FullContact的API中提取尽可能多的联系人数据 我遇到的问题是,如果FullContact中的“person”不存在一列数据,它会抛出一个NoMethodError,我无法将可能存在的其余数据保存到contact,因为我的方法会在出现错误时停止 我如何才能从NoMethodError中拯救出来,并让我的方法继续运行它的其余部分?它喜欢跳过错误并尝试代码的其余部分。我在救援代码中尝试了next和continue,

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

我遇到的问题是,如果FullContact中的“person”不存在一列数据,它会抛出一个NoMethodError,我无法将可能存在的其余数据保存到contact,因为我的方法会在出现错误时停止

我如何才能从NoMethodError中拯救出来,并让我的方法继续运行它的其余部分?它喜欢跳过错误并尝试代码的其余部分。我在救援代码中尝试了
next
continue
,但没有成功

谢谢你的帮助

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
class联系人异常
将“击中一个命名者”
拯救
结束
结束

通常,解决问题的方法是
尝试
方法()。要使故事简短—如果特定对象上不存在方法,则返回nil而不是引发异常

如果您只想确保它保存,可以使用
确保
执行以下操作:

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
class联系人
更多信息:

我认为这不是一个拯救像这样的诺贝尔奖获得者的好主意。。。你可能会遇到一些意想不到的麻烦,比如你输入了一个错别字,但它仍然在不断地拯救你,你不知道它从何而来。然而,我目前仍在从NoMethodError中拯救,因为考虑到我们为每个成功的api调用付费,我认为最好保存从FullContact提取的任何数据。开放的选择。你也可以使用。回应?要检查某个方法是否存在,而不是不管如何尝试命中它并从异常中解救出来(对于非rails应用程序)Hmm@djaszczurowski您将如何使用我提供的代码?
if person.try(:contact_info)。try(:family_name)。present?self.last\u name=person.contact\u info.family\u name end
如果contact\u info方法得到保证,那么我会调用
如果person.contact\u info.try(:family\u name).present?