0

XMLフィードをActiveRecordモデルにインポートするrakeタスクを作成しましたが、問題が発生しています。XMLフィードは空の列を公開しないため、移行ツールが機能しなくなります。空のフィールドをスキップするようにインポーターを設計するにはどうすればよいですか?

私の輸入業者はこのように見えます

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,

    ....

「desc」がxmlフィードで利用できないとしましょう。その場合、コードで「desc」を無視したいと思います。

エラーメッセージは役に立ちません:

undefined method `text' for nil:NilClass

しかし、それはテキストメソッドとは何の関係もありません。

4

2 に答える 2

0

Nokogiriクエリでテキストを探します。

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

    ...

要素が存在しない場合、これは例外をスローしません。

于 2012-11-16T02:04:49.337 に答える
0

try メソッドを使用できます。

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 が返されます。

于 2012-11-15T22:23:54.563 に答える