【Ruby】URI.joinの挙動に躓く

2020年8月24日Ruby

こんにちは、しきゆらです。
今回は、タイトル通り`URI.join`の挙動で詰まったのでメモしておきます。

URI.joinとは

join(uri_str, *path) -> object
文字列 uri_str と path … を URI として連結して得られる URI オブジェクトを返します。

https://docs.ruby-lang.org/ja/latest/method/URI/s/parse.html

ということで、URIの文字列にpathを良しなに結合してくれるメソッドです。
しかし、単に`/`を付けるだけの挙動をしているわけではありませんでした。


URI.joinの挙動

いかに例をいくつか書いておきます。

 # シンプルな例
 str = "https://example.com"
 URI.join(str, "home")
 #=> #<URI::HTTPS https://example.com/home>
 
 # base_uriにパスまで指定する場合
 str = "https://example.com/hoge"
 URI.join(str, "home")
 #=> #<URI::HTTPS https://example.com/home>
 
 # base_uriの末尾に/がある場合
 str = "https://example.com/hoge/"
 URI.join(str, "home")
 => #<URI::HTTPS https://example.com/hoge/home>
 
 # pathの先頭に/を置いた場合
 str = "https://example.com/hoge/"
 URI.join(str, "/home")
 #=> #<URI::HTTPS https://example.com/home>

このように、シンプルな場合は想定通りの動きをしてくれますが、base_uriに/を付けているときや指定するパスに/がついている場合は若干挙動が変わります。

個人的には、/は連結先(pathのほう、/homeのよう)に付けがちだったので、単純にURI.joinに置き換えただけだと意図しないURIを返してしまう箇所がありました。
使う場合は、上記の例を参考に注意して使いましょう。

まとめ

今回は、RubyのURI.joinの挙動で詰まったところがあったので挙動をまとめました。
これまで個人的にしていたURI文字列の結合の仕方が、このメソッドとは合わなかったので置き換えただけではうまく動かず困ったので、同様なところで困っている方の参考になれば幸いです。

今回は、ここまで。
おわり

Posted by shikiyura