dace
dace

Reputation: 6363

How to share conditional redirect logic for multiple routes in Rails?

I'm using Devise for authentication in a Rails 6 app. Once a user logs in, I'd like to conditionally check that they have completed onboarding before allowing them to visit any and all authenticated routes. If they haven't, then they should be redirected back through the onboarding flow. Something like this:

unless current_user.has_completed_onboarding
  redirect_to '/onboarding'
end

I have about a dozen routes where I want to implement this logic. What's the best way to add this check before each request to an authenticated route without duplicating it within each controller? Thanks!

Upvotes: 0

Views: 209

Answers (1)

Rafayet Monon
Rafayet Monon

Reputation: 1179

what you can do in this type of case is write a method in the ApplicationController. Suppose check_user_onboarding

def check_user_onboarding
  return redirect_to '/onboarding' unless current_user.has_completed_onboarding
end

Then in the controllers you can check by adding a before_action callback. The below one will check all the methods of that controller.

before_action :check_user_onboarding

You can also specify the methods that needs to be checked like -

before_action :check_user_onboarding, only: [:method1, :method2]

or there is also except

before_action :check_user_onboarding, except: [:method1, :method2]

Upvotes: 1

Related Questions