mirror of
https://github.com/jbranchaud/til
synced 2026-01-02 22:58:01 +00:00
Add Join URI Path Parts as a Ruby TIL
This commit is contained in:
@@ -10,7 +10,7 @@ pairing with smart people at Hashrocket.
|
|||||||
|
|
||||||
For a steady stream of TILs, [sign up for my newsletter](https://visualmode.kit.com/newsletter).
|
For a steady stream of TILs, [sign up for my newsletter](https://visualmode.kit.com/newsletter).
|
||||||
|
|
||||||
_1712 TILs and counting..._
|
_1713 TILs and counting..._
|
||||||
|
|
||||||
See some of the other learning resources I work on:
|
See some of the other learning resources I work on:
|
||||||
|
|
||||||
@@ -1412,6 +1412,7 @@ If you've learned something here, support my efforts writing daily TILs by
|
|||||||
- [Install Latest Version Of Ruby With asdf](ruby/install-latest-version-of-ruby-with-asdf.md)
|
- [Install Latest Version Of Ruby With asdf](ruby/install-latest-version-of-ruby-with-asdf.md)
|
||||||
- [Invoking Rake Tasks Multiple Times](ruby/invoking-rake-tasks-multiple-times.md)
|
- [Invoking Rake Tasks Multiple Times](ruby/invoking-rake-tasks-multiple-times.md)
|
||||||
- [IRB Has Built-In Benchmarking With Ruby 3](ruby/irb-has-built-in-benchmarking-with-ruby-3.md)
|
- [IRB Has Built-In Benchmarking With Ruby 3](ruby/irb-has-built-in-benchmarking-with-ruby-3.md)
|
||||||
|
- [Join URI Path Parts](ruby/join-uri-path-parts.md)
|
||||||
- [Jump Out Of A Nested Context With Throw/Catch](ruby/jump-out-of-a-nested-context-with-throw-catch.md)
|
- [Jump Out Of A Nested Context With Throw/Catch](ruby/jump-out-of-a-nested-context-with-throw-catch.md)
|
||||||
- [Last Raised Exception In The Call Stack](ruby/last-raised-exception-in-the-call-stack.md)
|
- [Last Raised Exception In The Call Stack](ruby/last-raised-exception-in-the-call-stack.md)
|
||||||
- [Limit Split](ruby/limit-split.md)
|
- [Limit Split](ruby/limit-split.md)
|
||||||
|
|||||||
43
ruby/join-uri-path-parts.md
Normal file
43
ruby/join-uri-path-parts.md
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# Join URI Path Parts
|
||||||
|
|
||||||
|
The
|
||||||
|
[`URI.join`](https://ruby-doc.org/stdlib-2.5.1/libdoc/uri/rdoc/URI.html#method-c-join)
|
||||||
|
method seems like a handy way to combine a base URL with some subpath. However,
|
||||||
|
there are some subtle gotchas depending on where forward slashes appear in the
|
||||||
|
two arguments.
|
||||||
|
|
||||||
|
Let's first look at the, in my opinion, desired behavior:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
> URI.join("https://example.com/api/v1/", "users")
|
||||||
|
=> #<URI::HTTPS https://example.com/api/v1/users>
|
||||||
|
```
|
||||||
|
|
||||||
|
The base URL has a trailing slash and the path that I want to join to it has no
|
||||||
|
leading slash. The result is a path where `users` is joined to the end of the
|
||||||
|
base URL. That's what I'm looking for.
|
||||||
|
|
||||||
|
Now, let's see some variations on the above approach that give results that I
|
||||||
|
wasn't expecting and don't want.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
> URI.join("https://example.com/api/v1", "/users") # 1
|
||||||
|
=> #<URI::HTTPS https://example.com/users>
|
||||||
|
> URI.join("https://example.com/api/v1", "users") # 2
|
||||||
|
=> #<URI::HTTPS https://example.com/api/users>
|
||||||
|
> URI.join("https://example.com/api/v1/", "/users") # 3
|
||||||
|
=> #<URI::HTTPS https://example.com/users>
|
||||||
|
```
|
||||||
|
|
||||||
|
1. No trailing slash on the base URL. Leading slash on the path to join. The
|
||||||
|
path portion of the base URL is wiped out and `/users` is joined in.
|
||||||
|
2. No trailing slash on the base URL. No leading slash on the path to join. The
|
||||||
|
`users` path replaces the last part of the path in the base URL.
|
||||||
|
3. Both a trailing slash in the base URL and a leading slash in the path to
|
||||||
|
join. Same behavior as 1.
|
||||||
|
|
||||||
|
I have two takeaways from this:
|
||||||
|
- Use with caution. If I'm going to use `URI.join` for this purpose, I need to
|
||||||
|
be careful to only use the form in the first code block.
|
||||||
|
- The `URI.join` method is probably meant to be primarily used to join a domain
|
||||||
|
(e.g. `http://example.com`) that has no path with some path segment.
|
||||||
Reference in New Issue
Block a user