Search code examples
ruby-on-railsrubyruby-on-rails-4devise

Rails 4:Error in setting up SignIn Page as root page using Devise


I am using Devise Gem for authentication but for the index/root page for my application I want to use sign_in page of devise gem.

I have used the following code in the config/routes.rb file

root  'devise/sessions#new'

I am getting the following error

Could not find devise mapping for path "/". This may happen for two reasons: 1) You forgot to wrap your route inside the scope block. For example: devise_scope :user do get "/some/route" => "some_devise_controller" end 2) You are testing a Devise controller bypassing the router. If so, you can explicitly tell Devise which mapping to use: @request.env["devise.mapping"] = Devise.mappings[:user]

Here is snapshot of my rake routes output

                  Prefix Verb   URI Pattern                           Controller#Action
        new_user_session GET    /users/sign_in(.:format)              devise/sessions#new
            user_session POST   /users/sign_in(.:format)              devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)             devise/sessions#destroy
           user_password POST   /users/password(.:format)             devise/passwords#create
       new_user_password GET    /users/password/new(.:format)         devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format)        devise/passwords#edit
                         PATCH  /users/password(.:format)             devise/passwords#update
                         PUT    /users/password(.:format)             devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)               devise/registrations#cancel
       user_registration POST   /users(.:format)                      devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)              devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)                 devise/registrations#edit
                         PATCH  /users(.:format)                      devise/registrations#update
                         PUT    /users(.:format)                      devise/registrations#update
                         DELETE /users(.:format)                      devise/registrations#destro
  workout_schedules_find POST   /workout_schedules/find(.:format)     workout_schedules#find
       workout_schedules GET    /workout_schedules(.:format)          workout_schedules#index
                         POST   /workout_schedules(.:format)          workout_schedules#create
    new_workout_schedule GET    /workout_schedules/new(.:format)      workout_schedules#new
   edit_workout_schedule GET    /workout_schedules/:id/edit(.:format) workout_schedules#edit
        workout_schedule GET    /workout_schedules/:id(.:format)      workout_schedules#show
                         PATCH  /workout_schedules/:id(.:format)      workout_schedules#update
                         PUT    /workout_schedules/:id(.:format)      workout_schedules#update
                         DELETE /workout_schedules/:id(.:format)      workout_schedules#destroy

Solution

  • Try to set your route file like this:

      devise_scope :user do
        authenticated :user do
          root 'home#dashboard', as: :authenticated_root
        end
    
        unauthenticated do
          root 'devise/sessions#new', as: :unauthenticated_root
        end
      end
    

    Devise provides some inbuilt methods like authenticated, unauthenticated etc. So as per your requirement, you can set different root for logged in users and non-logged in users. :as will create custom named url helpers like authenticated_root_path and unauthenticated_root_path

    If you will run rake routes, you will get:

       authenticated_root GET      /                             home#dashboard
     unauthenticated_root GET      /                             devise/sessions#new