Search code examples
ruby-on-railsrubydevise

Ruby on Rails: redirect unauthenticated user to root instead of the sign in page


I am using Rails 4 and Devise 3.

I am using the following in the routes file to prevent access to a page from non authenticated users (not signed in):

authenticate :user do
   #page to protect 
end

This redirects me to the user/sign_in page, but I want the user to be redirected to the root. So, I added the following as well to the routes page:

get 'user/sign_in' => redirect('/')

But this will mess up what I did in the sessions_controllers:

def new
    return render :json => {:success => false, :type => "signinn", :errors => ["You have to confirm your email address before continuing."]}
end

This will stop showing. So, I would like another solution that redirects users to the root directly, instead of having to use authenticate :user and then get 'user/sign_in' => redirect('/').

The following may not have anything to do with redirecting the user to the root, but I would like to explain more about why I am overwriting the new method in the sessions_controller. I moved the sign_in and sign_up views to the root page (home page). In this case, I also needed to hack the error messages so that they appear in the home page, instead of redirecting the user to user/sign_in to show the errors. I used ajax for that.

Update

What I am looking for is something like this:

if user_authenticated? 
  #show the protected page
else  
  # redirect the user to the ROOT
end

Solution

  • I'm sorry I didn't understand your question, anyway you can do something like this:

    class CustomFailure < Devise::FailureApp
        def route(scope)
          #return super unless [:worker, :employer, :user].include?(scope) #make it specific to a scope
           new_user_session_url(:subdomain => 'secure')
        end
    
        # You need to override respond to eliminate recall
        def respond
          if http_auth?
            http_auth
          else
            redirect
          end
        end
      end
    

    And in config/initializers/devise.rb:

      config.warden do |manager|
        manager.failure_app = CustomFailure
      end
    

    This was taken from the wiki of devise: https://github.com/plataformatec/devise/wiki/How-To%3a-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated