https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=# {user}&count=#{number} (URI::InvalidURIError)
コマンドラインから解析される私の引数は
name = ARGV[1]
number = ARGV[2]
助けていただければ幸いです...
https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=# {user}&count=#{number} (URI::InvalidURIError)
コマンドラインから解析される私の引数は
name = ARGV[1]
number = ARGV[2]
助けていただければ幸いです...
URL に値を挿入しようとする代わりに、正しいことを行い、Ruby に特殊文字の可能なエンコーディングを処理させます。
require 'uri'
name = 'foo'
number = 1
uri = URI('https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true')
uri.query = URI.encode_www_form(
Hash[
URI.decode_www_form(uri.query)
].merge('name' => name, 'count' => number)
)
puts uri
実行後の出力は次のとおりです。
https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&name=foo&count=1
補間を使用して URL に値を挿入できる場合は 90% の確率で機能しますが、エンコードする必要がある文字を含める必要がある場合があり、URL を使用しようとするとエラーが発生します。それ。
URIクラスはクエリのエンコード方法の仕様に従っているため、これらの問題に遭遇することはありません。
分解すると、何が起こるかがわかります。
uri.query
# => "include_entities=true&include_rts=true"
URI.decode_www_form(uri.query)
# => [["include_entities", "true"], ["include_rts", "true"]]
Hash[URI.decode_www_form(uri.query)]
# => {"include_entities"=>"true", "include_rts"=>"true"}
Hash[URI.decode_www_form(uri.query)].merge('name' => name, 'count' => number)
# => {"include_entities"=>"true", "include_rts"=>"true", "name"=>"foo", "count"=>1}
URI.encode_www_form(Hash[URI.decode_www_form(uri.query)].merge('name' => name, 'count' => number))
# => "include_entities=true&include_rts=true&name=foo&count=1"
編集:
URI:Module の未定義のメソッド `decode_www_form' (NoMethodError)
ルビー1.9を使用しています
Addressable gemを見てください。これは非常にうまくできており、組み込みの URI クラスよりも多くの機能を備えています。
require 'addressable/uri'
name = 'foo'
number = 1
uri = Addressable::URI.parse('https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true')
uri.query_values = uri.query_values.merge('name' => name, 'count' => number)
puts uri
次のようになります。
https://api.twitter.com/1/statuses/user_timeline.json?count=1&include_entities=true&include_rts=true&name=foo