Rails 4 – 如何从 NoMethodError 中解救并继续尝试方法?
Rails 4 – How to rescue from NoMethodError and continue trying method?
在我的联系人 class 中,在使用他们的电子邮件地址创建联系人后,我尝试从 FullContact 的 API 中提取尽可能多的联系人数据。
我遇到这个问题,如果 FullContact 中 "person" 的一列数据不存在,它会抛出一个 NoMethodError,我无法保存可能存在的其余数据联系人确实存在,因为我的方法在错误处停止。
如何从 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
一般来说,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
在我的联系人 class 中,在使用他们的电子邮件地址创建联系人后,我尝试从 FullContact 的 API 中提取尽可能多的联系人数据。
我遇到这个问题,如果 FullContact 中 "person" 的一列数据不存在,它会抛出一个 NoMethodError,我无法保存可能存在的其余数据联系人确实存在,因为我的方法在错误处停止。
如何从 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
一般来说,try
方法 (http://apidock.com/rails/Object/try) 可能是您问题的解决方案。简而言之 - 如果特定对象
如果你只是想确保它保存,你可以使用 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