使用rake任务和Nokogiri将XML Feed保存到数据库时导入错误

时间:2012-11-15 21:36:27

标签: ruby-on-rails ruby database nokogiri

我编写了一个rake任务,将XML Feed导入我的ActiveRecord模型,但遇到了一些麻烦 - XML Feed不会发布任何空列,这会破坏我的迁移工具。如何设计导入器以便跳过空白字段?

我的导入程序看起来像这样

desc "Import XML Feed into Items Database v20121116" 
task :new_import_items => :environment do

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::XML(File.open("#{Rails.root}/lib/tasks/datafeed.xml"))

actions = doc.xpath("/merchantProductFeed/merchant/prod") 

actions.each do |action|

a = Item.where("affiliate_product_id = ?", action.css("pId").text).first


if a != nil

  a.update_attributes(

    :brand => action.at('brandName').text, 
    :description => action.at('desc').text, 
    :regular_price => action.at('buynow').text,

    ....

假设xml Feed上没有“desc”。我希望我的代码在该实例中忽略“desc”。

错误消息无用:

undefined method `text' for nil:NilClass

但它与文本方法无关。

2 个答案:

答案 0 :(得分:0)

您可以使用try method

if a != nil
  a.update_attributes(
    :brand => action.at('brandName').try(:text), 
    :description => action.at('desc').try(:text), 
    :regular_price => action.at('buynow').try(:text),

    ....

医生说:

  

如果接收对象是nil对象或NilClass:NoMethodError异常将引发,而是返回nil。

答案 1 :(得分:0)

我在Nokogiri查询中查找文字:

if a != nil
  a.update_attributes(
    :brand => action.at('brandName/text()'), 
    :description => action.at('desc/text()'), 
    :regular_price => action.at('buynow/text()'),

    ...

如果元素不存在,则不会抛出异常。