From e7457a9e5492ba2cd7411aa931b1946f9010f2da Mon Sep 17 00:00:00 2001 From: jbranchaud Date: Fri, 28 Oct 2022 18:30:50 -0500 Subject: [PATCH] Add Why Redirect And Return In Controllers as a Rails TIL --- README.md | 3 +- .../why-redirect-and-return-in-controllers.md | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 rails/why-redirect-and-return-in-controllers.md diff --git a/README.md b/README.md index 40c5f26..962ad00 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186). -_1260 TILs and counting..._ +_1261 TILs and counting..._ --- @@ -857,6 +857,7 @@ _1260 TILs and counting..._ - [Use IRB And Ruby Flags With Rails Console](rails/use-irb-and-ruby-flags-with-rails-console.md) - [Verify And Read A Signed Cookie Value](rails/verify-and-read-a-signed-cookie-value.md) - [Where Am I In The Partial Iteration?](rails/where-am-i-in-the-partial-iteration.md) +- [Why Redirect And Return In Controllers](rails/why-redirect-and-return-in-controllers.md) - [Wipe Out All Precompiled Assets](rails/wipe-out-all-precompiled-assets.md) - [Write Reversible Migration To Set Default](rails/write-reversible-migration-to-set-default.md) - [Write Safer Where Clauses With Placeholders](rails/write-safer-where-clauses-with-placeholders.md) diff --git a/rails/why-redirect-and-return-in-controllers.md b/rails/why-redirect-and-return-in-controllers.md new file mode 100644 index 0000000..8b832e8 --- /dev/null +++ b/rails/why-redirect-and-return-in-controllers.md @@ -0,0 +1,38 @@ +# Why Redirect And Return In Controllers + +A fairly common idiom in Rails controller actions is a `redirect_to` followed +by an `and return`. + +```ruby +def show + redirect_to sign_in_path and return if current_user.blank? + + book = Book.find(params[:id]) + + render book +end +``` + +Because a `render` comes later in the controller action, we need to _early +return_ after the redirect to avoid multiple render/redirect warnings. + +It is important to use `and` here instead of `&&` because of logical operator +precedence. + +If we used `&&` instead: + +```ruby + redirect_to sign_in_path && return if current_user.blank? +``` + +The `redirect_to` would get `nil` (the result of `sign_in_path && nil`). If we +did want to use `&&`, we'd need to be diligent with method call parentheses. + +```ruby + redirect_to(sign_in_path) && return if current_user.blank? +``` + +In this case, `redirect_to` would actually get called with a path string and +the `return` would be called after that. + +[source](https://stackoverflow.com/a/37211314/535590)