diff --git a/README.md b/README.md index 92d4468..8ce0ee4 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/rails/define-conditional-routing-logic-in-routes-file.md b/rails/define-conditional-routing-logic-in-routes-file.md new file mode 100644 index 0000000..238dafc --- /dev/null +++ b/rails/define-conditional-routing-logic-in-routes-file.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`.