【Ruby】URI.joinの挙動に躓く
こんにちは、しきゆらです。
今回は、タイトル通り`URI.join`の挙動で詰まったのでメモしておきます。
URI.joinとは
https://docs.ruby-lang.org/ja/latest/method/URI/s/parse.html
join(uri_str, *path) -> object
文字列 uri_str と path … を URI として連結して得られる URI オブジェクトを返します。
ということで、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文字列の結合の仕方が、このメソッドとは合わなかったので置き換えただけではうまく動かず困ったので、同様なところで困っている方の参考になれば幸いです。
今回は、ここまで。
おわり