2012-01-03 6 views
1

をレールにGoogle Appsのスクリプトを変換:ルビー/ Railsの - 私はRailsので動作するようにはGoogle Appスクリプトに次の変換方​​法、トラブルのビットを抱えている

Tutorial: Parsing an XML Document

これは私が「メソッドであります変換したいdは:これは私がこれまで持っているものである

function parse(txt) { 
    var doc = Xml.parse(txt, true); 
    var attr = doc.spellcheck; 
    if (attr) { 
    return "Cannot find actor: " + attr.name; 
    } 

    var actors = doc.html.head.getElements("actor");  
    var movies = doc.html.head.getElements("movie"); 

    if (!actors || actors.length ==0) { 
    return "no match found"; 
    } 

    var movieIndex = 0; 
    var r = ''; 
    var firstPerson = true; 
    for (var i in actors) { 
    r = r + actors[i].getText(); 
    if (movies[movieIndex]) { 
     r = r + (firstPerson ? "" : " who") + " was in " + 
     movies[movieIndex].getText() + " with "; 
    } 
    movieIndex++; 
    firstPerson = false; 
    } 

    return r; 
} 

私はXMLを解析するために Nokogiriを使用してい

uri = "http://oracleofbacon.org/cgi-bin/xml?a=Kevin%20Bacon&b=#{to.strip.to_hash}&u=1&p=google-apps" 
doc = Nokogiri::XML(open(uri)) 

変換での私の試み:

def parse(doc) 

    attr = doc.xpath("//link//actor").first # => "<actor>Miley Cyrus</actor>" 

    if (!attr) 
     return "Cannot find actor: #{attr}" 
    end 

    actors = doc.xpath("//link//actor") 
    movies = doc.xpath("//link//movie") 

    if (!actors || actors.length == 0) 
     return "No match found." 
    end 

    movieIndex = 0 
    r = "" 
    firstPerson = true 

    actors.each do |actor| 
     r = r + actor 

     if (movies[movieIndex]) 
      r = r + (firstPerson ? "" : " who") + " was in #{movies[movieIndex]} with " 
     end 

     movieIndex++ 
     firstPerson = false; 
    end 

    return r 
end 

私はエラーを取得する:

`block in parse': undefined method `[email protected]' for false:FalseClass (NoMethodError) 

これはfirstPerson = falseライン上で起こっています。

+1

だから、うまくいきませんか? –

+0

@SergioTulentsev私はエラーで更新しました。 – fuzz

+0

フルビオ:明らかにそうです:-) –

答えて

4

actors.eachは、ブロックに各アクターノードを生成します。したがって、i変数にはアクター要素(Nokogiri::XML::Element)が含まれています。したがってactors[i]は意味をなさないので、最初のエラーが発生します。

私はあなたがStringNokogiri::XML::Elementを連結しようとすると何が起こるかわからないが、おそらく、

actors.each do |actor| 
    r = r + actor 
    [...] 
end 

を探しています。

また、movieIndex++はあなたの希望をしません。あなたはmovieIndex += 1が欲しい。

すべてのループでmovieIndexを増やしているだけなので、その行を完全に削除してactors.each do |actor, movieIndex|とすることもできます。

関連する問題