2012-01-03 11 views
3
URIがブラウザ内だけで正常に動作したときに、私は次のエラーを取得していますなぜわからない

:私が得るルビー/ Railsの - バートURI

def kb(to) 

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

    return parse(doc) 
end 

:これは私のコードである

http://oracleofbacon.org/cgi-bin/xml?a=Kevin Bacon&b=Tom Cruise&u=1&p=google-apps 

次のエラー:

in `split': bad URI(is not URI?): http://oracleofbacon.org/cgi-bin/xml?a=Kevin Bacon&b=Tom Cruise&u=1&p=google-apps (URI::InvalidURIError)` 

は、私は次のようにメソッドを実行します。

+0

は、私たちにいくつかのコード –

答えて

20

ブラウザは病的に友好的で、子犬のようなものだから、ページをレンダリングしたりURLを解決したりするのに大変便利です。あなたは親切にする方法を教えなければならないので、アプリケーションはそれをしません。

スペースにスペースが含まれているため、URLが無効です。 %20でスペースを置き換えます

エスケープする必要が文字をエスケープ
irb -f 
irb(main):001:0> require 'open-uri' 
=> true 
irb(main):002:0> open('http://oracleofbacon.org/cgi-bin/xml?a=Kevin%20Bacon&b=Tom%20Cruise&u=1&p=google-apps').read 
=> "<?xml version=\"1.0\" standalone=\"no\"?>\n<link><actor>Tom Cruise</actor><movie>A Few Good Men (1992)</movie><actor>Kevin Bacon</actor></link>" 

は簡単です:

irb -f 
irb(main):001:0> require 'uri' 
=> true 
irb(main):002:0> URI.escape('http://oracleofbacon.org/cgi-bin/xml?a=Kevin Bacon&b=Tom Cruise&u=1&p=google-apps') 
=> "http://oracleofbacon.org/cgi-bin/xml?a=Kevin%20Bacon&b=Tom%20Cruise&u=1&p=google-apps" 
+0

を表示、おかげで御馳走を働きました。私は以下のことをしましたが、スペースを%20で置き換えるためのよりクリーンな方法があると確信しています: '#{to.strip.gsub(" "、"%20 ")}' – fuzz

+0

@Fulvio 'require 'cgi '; CGI ::エスケープ( "'停止!'とフレッド")#= ""%27停止%21%27 + Fred "と言いました。([doc](http://ruby-doc.org/stdlib-1.9.3 /libdoc/cgi/rdoc/CGI.html#method-c-escape))。 (または、レールの 'h 'ヘルパーメソッド)。 – steenslag

+0

@Fulvio、私は文字列をエスケープする方法を示すコードを追加しました。 'gsub'を使うのは、1文字だけを置き換える必要があることがわかっていればOKです。それを超えて、あらかじめ発明されたホイールを利用し、[URI](http://rubydoc.info/stdlib/uri/frames)または[アドレス可能](http://rubydoc.info/gems/addressable /フレーム)の宝石であり、非常にフル装備です。 –

関連する問題