Sessions controller

登入和登出的功能會由 Sessions controller 相對應的 actions 處理:

  • 登入表單由 new action 處理
  • 登入的過程是透過向 create action 發送 POST 請求
  • 登出的過程是透過向 destroy action 發送 DELETE 請求

現在來建立 Sessions controller 和 new action:

$ rails generate controller Sessions new

因為加了 new 參數,會同時幫你建立相對應的 view,但 createdestroy 不需要 view,所以沒加上去。

我們要建立一個登入表單以創建一個新的 session,架構如下:

Users resource 使用了 resource 方法自動建立完整的 RESTful 路由,不過 Sessions resource 不必這麼完整,它只需要具名路由(named routes):

  • login_path 用來處理 GET 和 POST 請求
  • logout_path 用來處理 DELETE 請求

完整路由設定如下,同時我們也刪除不需要的路由設定:

config/routes.rb

Rails.application.routes.draw do
  root                'static_pages#home'
  get    'help'    => 'static_pages#help'
  get    'about'   => 'static_pages#about'
  get    'contact' => 'static_pages#contact'
  get    'signup'  => 'users#new'
  get    'login'   => 'sessions#new'
  post   'login'   => 'sessions#create'
  delete 'logout'  => 'sessions#destroy'
  resources :users
end

產生的路由架構如下:

HTTP request URL Named route Action Purpose
GET /login login_path new page for a new session (login)
POST /login login_path create create a new session (login)
DELETE /logout logout_path destroy delete a session (log out)

可以使用 rake routes 查看目前所有的路由規則:

$ bundle exec rake routes
 Prefix Verb   URI Pattern               Controller#Action
     root GET    /                         static_pages#home
     help GET    /help(.:format)           static_pages#help
    about GET    /about(.:format)          static_pages#about
  contact GET    /contact(.:format)        static_pages#contact
   signup GET    /signup(.:format)         users#new
    login GET    /login(.:format)          sessions#new
          POST   /login(.:format)          sessions#create
   logout DELETE /logout(.:format)         sessions#destroy
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy