0

私は、XML ファイルを介して日付のリストを取得し、すべての日付のハッシュを作成する Sinatra アプリケーションに取り組んでいます。

ID を取得して変数に代入しているときに、奇妙な問題が発生しています。

私が得ているエラーは次のとおりです。 文字列から整数への暗黙的な変換はなく、行にスローされていevent_date_id = event_date["date_id"]ます。私のコードにはほぼ同じメソッドがあり、うまく機能しています。puts event_date['date_id']私が正しい数値のdate_idを教えてくれるとき。

念のため、event_date['date_id'] のクラスは、他のメソッドの id フィールドと同じ REXMLUtiliyNodeString です。私がしようとするevent_date['date_id'].to_iと、その時点で休憩ができます。

def get_dates(event_id)

url = "some_url_to_some_xml"
puts '==================='
puts "Pulling in #{url}"
puts '==================='
date_xml = Crack::XML.parse(open(url))

dates = {}

date_xml['document']['date'].each do | event_date |

  event_date_id = event_date['date_id']

  single_date = {
    'date_id' => event_date_id,
    'date_start' => event_date['datestart'],
    'date_end' => event_date['dateend'],
    'date_live' => event_date['live'],
    'time_start' => event_date['timestart'],
    'time_end' => event_date['timestart'],
    'date_available' => event_date['date_available']
  }

  dates.merge!( event_date_id => single_date )

end

return dates

end

xml 形式は次のとおりです。

<document>
    <date>
        <date_id>881908</date_id>
        <live>y</live>
        <datestart>2017-08-14</datestart>
        <dateend>2017-08-15</dateend>
        <timestart>13:00</timestart>
        <timeend>0:00</timeend>
        <date_available>10000</date_available>
    </date>
<document>

これは本当に単純なことだと思いますが、それを理解しようとして頭を悩ませています。誰かがこれに光を当てることができれば、私は間違いなく感謝します.

編集 1: irb でコードを実行すると、実際にエラーなく動作します。どこかで、どういうわけか、シナトラ、ラック、またはショットガンが邪魔をしているようです。

4

3 に答える 3

1

問題の原因が見つかりました。日付/イベントのエントリが1つあるxmlファイルを解析しているときにのみ発生します。

この質問は、私が抱えていた正確な問題を説明しており、答えには私のために働いた回避策が含まれています。

if(!date_xml['document']['date'].is_a?(Array))
  date_xml['document']['date'] = [ date_xml['document']['date'] ]
end
于 2013-08-24T00:46:39.517 に答える
0

このメッセージは、文字列インデックスを使用して配列内の値を検索しようとすると発生します。

2.0.0p353 :001 > results = [""]
 => [""] 
2.0.0p353 :002 > results["x"]
TypeError: no implicit conversion of String into Integer
    from (irb):2:in `[]'
    from (irb):2
    from /home/jeff/.rvm/rubies/ruby-2.0.0-p353/bin/irb:12:in `<main>'

配列は整数インデックスによってのみアクセスできるため、Ruby はキー名を整数に変換しようとしますが、任意の文字列データを表すためにどの数値を使用すればよいかわからないため失敗します。したがって、「文字列から整数への暗黙的な変換はありません」というメッセージが表示されます。

これが発生した場合の答えは、コードを修正して、ハッシュのような配列にアクセスしようとしないようにすることです。必要なキーが常にそこにあり、常にインポートされるという前提で XML または JSON データからインポートしているが、それでもこれを取得している場合、その前提は間違っています。データが期待どおりにフォーマットされていません。データを修正するか、異なる形式を処理するようにコードを修正してください。

于 2013-12-05T11:32:24.020 に答える