Question

I am attempting to setup my routes.rb so that /sessions/ is not required in the url for logging in and out of the site. Below are my samples to show what I am trying to achieve. Whilst the "second attempt" does in fact do what I want, I'd like to know if there is a more efficient way of doing this. I am very new to rails and I am sure that the routes.rb has some option that can do what I am doing in three large lines.

First attempt

routes.rb

namespace :account do
  resources :users
  resources :sessions
end

$ rake routes

                  Prefix Verb   URI Pattern                          Controller#Action
           account_users GET    /account/users(.:format)             account/users#index
                                       ...
        account_sessions GET    /account/sessions(.:format)          account/sessions#index
                         POST   /account/sessions(.:format)          account/sessions#create
     new_account_session GET    /account/sessions/new(.:format)      account/sessions#new
    edit_account_session GET    /account/sessions/:id/edit(.:format) account/sessions#edit
         account_session GET    /account/sessions/:id(.:format)      account/sessions#show
                         PATCH  /account/sessions/:id(.:format)      account/sessions#update
                         PUT    /account/sessions/:id(.:format)      account/sessions#update
                         DELETE /account/sessions/:id(.:format)      account/sessions#destroy

Second attempt

routes.rb

  namespace :account do
    resources :users
    match '/login', :controller => 'sessions', :action => 'new', :via => [:get]
    match '/login', :controller => 'sessions', :action => 'create', :via => [:post]
    match '/logout', :controller => 'sessions', :action => 'destroy', :via => [:delete]
  end

$ rake routes

           Prefix Verb   URI Pattern                       Controller#Action
    account_users GET    /account/users(.:format)          account/users#index
                                       ...
    account_login GET    /account/login(.:format)          account/sessions#new
                  POST   /account/login(.:format)          account/sessions#create
   account_logout DELETE /account/logout(.:format)         account/sessions#destroy

Can this be done without having to manually specific the match locations? All I want to do is remove /sessions/ as a requirement.

Was it helpful?

Solution

namespace :account do
  resources :users #-> account/users
  resources :sessions, path: "", path_names: { new: "login", create: "login", destroy: "logout" } #-> accounts/login, accounts/logout
end

OTHER TIPS

I hope you realise you have /login twice in your second example. This simplifies it a bit but you will always have to match each route you want to specify outside any defaults.

namespace :account do
  match '/login', to: 'sessions#new', via: [:get]
  match '/logout', to: 'sessions#destroy', via: [:delete]
end

In rails3 we should use with_options in following way:

scope '/account' do
  match '/login' => "sessions#new", :as => :login
  post '/:login' => 'sessions#create', :as => :signup_create
  delete '/:logout' => 'sessions#destroy', :as => :logout
end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top