ruby-on-rails - 使用 Nokogiri 的 NoMethodError

标签 ruby-on-rails ruby

我正在使用 Nokogiri 创建一个导入脚本来解析 XML 文件,然后循环遍历在我的数据库中创建新“产品”的节点。除了讨厌的价格字段(它是一个 float )之外,一切正常。

Product.create(:name => node.xpath("./text/name/text()"), 
               :description => node.xpath("./text/desc/text()"),
               :brand => node.xpath("./brand/brandName/text()"),
               :merchant => node.xpath("../@name"),
         >> (A) #:price => 1.99))
         >> (B) #:price => node.xpath("./price/buynow/text()"))
         >> (C) #:price => node.xpath("./price/buynow/text()").to_f))

有问题的 XML 节点看起来像这样......

<buynow>6.99</buynow>  

当我尝试行 (A) 进行测试时,它工作正常,但显然不受欢迎。

当我尝试行 (B) 或 (C) 尝试从节点获取值时,我的页面挂起,WEBrick 需要重新启动(终端中没有错误)并且日志中出现以下错误:

NoMethodError (undefined method `to_f' for [#<Nokogiri::XML::Text:0x81f5220c "6.99">]:Nokogiri::XML::NodeSet):

注意:即使我没有显式调用to_f方法也会出现同样的错误

我猜我需要以某种方式将节点值转换为 float ,但明显的方法导致了错误!

有人可以阐明这一点吗?

最佳答案

#xpath#css#find 方法返回节点集,它们是子类数组,即使只有元素匹配。将价格提取为 float :

node.xpath("./price/buynow/text()").map(&:to_f).first

关于ruby-on-rails - 使用 Nokogiri 的 NoMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4892110/

相关文章:

ruby-on-rails - 子类化模型时的数据库和关系设计

ruby-on-rails - 在 Posts 模型中保存的用户 ID,如何呈现该用户?

ruby - 如何使用 apt 安装指定版本的 Ruby

sql - Rails Active Record 相当于带有条件表达式的 SQL

ruby-on-rails - ruby 错误 : "No such file or directory -- script/generate (LoadError)"

ruby-on-rails - 在 Rails Controller 中测试 JS 操作,响应始终为空

ruby-on-rails - 安装 RubyPress

mysql - Rails 列带有 ":references"-- 困惑

ruby-on-rails - 使用 RVM 升级到 Ruby 2.1.2 后出现 PaperTrail (paper_trail) 错误。未初始化常量 PaperTrail::Rails::Engine

ruby - 相当于 Ruby 中的 “pass”