1
0
mirror of https://github.com/jbranchaud/til synced 2026-07-02 23:58:25 +00:00

Add Define Conditional Routing Logic In Routes File as a Rails TIL

This commit is contained in:
jbranchaud
2026-06-22 17:52:13 -05:00
parent 20bbdb6d55
commit 950e2f861a
2 changed files with 39 additions and 1 deletions
+2 -1
View File
@@ -10,7 +10,7 @@ working across different projects via [VisualMode](https://www.visualmode.dev/).
For a steady stream of TILs, [sign up for my newsletter](https://visualmode.kit.com/newsletter).
_1799 TILs and counting..._
_1800 TILs and counting..._
See some of the other learning resources I work on:
@@ -1148,6 +1148,7 @@ If you've learned something here, support my efforts writing daily TILs by
- [Customize Paths And Helpers For Devise Routes](rails/customize-paths-and-helpers-for-devise-routes.md)
- [Customize Template For New Schema Migration](rails/customize-template-for-new-schema-migration.md)
- [Customize The Path Of A Resource Route](rails/customize-the-path-of-a-resource-route.md)
- [Define Conditional Routing Logic In Routes File](rails/define-conditional-routing-logic-in-routes-file.md)
- [Define The Root Path For The App](rails/define-the-root-path-for-the-app.md)
- [Delete Paranoid Records](rails/delete-paranoid-records.md)
- [Demodulize A Class Name](rails/demodulize-a-class-name.md)
@@ -0,0 +1,37 @@
# Define Conditional Routing Logic In Routes File
I ran into a situation recently where I needed to intercept the behavior a
common public-facing route in an app. Broadly, the route is for company specific
rental pages with query parameters that correspond to their available inventory.
What I needed was a way to display a demo version of that rental page ignoring
everything else about how the request would otherwise be processed, validated,
and rendered.
Instead of introducing a bunch of weird conditional logic into this already
complex rental controller, I was able to intercept the request at the routing
layer when `demo=true` is set and send it to a different controller.
Here is what that section of `config/routes.rb` looks like:
```ruby
get "rentals/new", to: "rental_demos#show",
as: :rental_demo,
constraints: ->(request) { request.params[:demo] == "true" }
resources :rentals, only: %i[new create] do
# ...
end
```
This specifies a `constraint` on the `get` handler matching for a given request.
If the constraint isn't met, then the route handling logic proceeds where it
will instead find a match with the original new rentals resource routing.
Now I can reference a version of this URL that includes `demo=true` as a way of
having an always-available realistic-looking version of the rental page even if
one of these companies doesn't actively have available inventory.
Those requests will get intercepted by the first matching route handler which
will send them to the `RentalDemosController` instead of the
`RentalsController`.