在访问文本方法之前检查Nokogiri对象是否为nil

时间:2016-09-23 16:14:37

标签: ruby-on-rails ruby nokogiri

我正在使用Nokogiri搜索我从API收到的XML。

fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
 [name()='serving']/*[name()='fiber']").first.text

有时候,响应中缺少子元素(例如光纤)。在这种情况下,Nokogiri返回一个nil对象,我的代码抛出相应的异常(未定义的方法`text' for nil:NilClass)因为我试图访问'文本'零物体的方法。

在实际尝试调用“文本”之前,检查子元素(例如光纤)是否存在的干净且快速的方法是什么?方法呢?如果它不存在,我想将值设置为0.我也为其他几个子元素(例如卡路里,碳水化合物等)做这个。

2 个答案:

答案 0 :(得分:5)

您可以使用"尝试"对于那些案件

fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
     [name()='serving']/*[name()='fiber']").first.try(:text)

如果first为nil则返回nil,如果它不是nil则返回

如果您需要默认值,如果它没有,您可以

fiber = doc.xpath("/*[name()='food']/*[name()='servings']/*
     [name()='serving']/*[name()='fiber']").first.try(:text) or 'default'

答案 1 :(得分:0)

element = doc.xpath("/*[name()='food']/*[name()='servings']/*

[名称()= '服务'] / * [名称()= '纤维']“)

fiber = element.present? ? element.first.text : <handle other case here>