railsチュートリアル第八章 基本的なログイン機構


今回はユーザーがログインやログアウトを行う。
本章では、ログインの基本的な仕組みを実装
ブラウザがログインしている状態を保持し、ユーザーによってブラウザが閉じられたら状態を破棄するといった仕組み
ログイン済みのユーザー（current user）だけがアクセスできるページや、扱える機能などを制御していきます。
このような制限や制御の仕組みを認可モデル（Authorization Model）という。

##セッション
ユーザーログインの必要なWebアプリケーションでは、セッション（Session）と呼ばれる半永続的な接続をコンピュータ間（ユーザーのパソコンのWebブラウザとRailsサーバーなど）に別途設定します。

Railsでセッションを実装する方法として最も一般的なのは、cookiesを使う方法
....。

新しいブランチを作る

```
$ git checkout -b basic-login
```
###Sessionsコントローラ
ここでは```new```アクションを作る

```rb
ubuntu:~/environment/sample_app (basic-login) $ rails generate controller Sessions new
Running via Spring preloader in process 9802
      create  app/controllers/sessions_controller.rb
       route  get 'sessions/new'
      invoke  erb
      create    app/views/sessions
      create    app/views/sessions/new.html.erb
      invoke  test_unit
      create    test/controllers/sessions_controller_test.rb
      invoke  helper
      create    app/helpers/sessions_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/sessions.scss
```

ファイルを作成

####リソースを追加して標準的なRESTfulアクションをgetできるようにする
config/routes.rb

```rb
Rails.application.routes.draw do
  get 'sessions/new'
  root 'static_pages#home'
  # 何の意味がわからん
  # ホーム画面がhomeページなるらしい
  get  '/help',    to: 'static_pages#help'
  # static_pagesコントローラからhomeアクションに紐付けされる
  # getでアクセルすることでページを取得することができる
  get  '/about',   to: 'static_pages#about'
  # 何を書いているかはわからない
  get  '/contact', to: 'static_pages#contact'
  # aboutアクションにGETリクエストを送る
  get  '/signup',  to: 'users#new'
  # urlに/signupと書くとuserコントローラのnewアクションを起こす
  get    '/login',   to: 'sessions#new'
  # データを取得
  post   '/login',   to: 'sessions#create'
  # データを投稿
  delete '/logout',  to: 'sessions#destroy'
  # 削除
  resources :users
  # /users/1の有効にするため
end
```
リクエスト　url  　  名前付きルート     アクション  　　用途
GET	　　　/login	　　login_path	　　new	　　　　　新しいセッションのページ（ログイン）
POST	　　/login	　　login_path	　　create	　　　　新しいセッションの作成（ログイン）
DELETE	　/logout	　logout_path	　　destroy	　　　　セッションの削除（ログアウト）


rails routes

```                                                                     
 login GET    /login(.:format)  sessions#new                                                                       
       POST   /login(.:format)    sessions#create                                                                     
logout DELETE /logout(.:format)   sessions#destroy                                                              
```
###演習
1.GET login_pathとPOST login_pathとの違いを説明できますか? 少し考えてみましょう。

```GET login_path```はloginページを表示させる
```POST login_path```はloginのためにデータを送信する

2.ターミナルのパイプ機能を使ってrails routesの実行結果とgrepコマンドを繋ぐことで、Usersリソースに関するルーティングだけを表示させることができます。同様にして、Sessionsリソースに関する結果だけを表示させてみましょう。現在、いくつのSessionsリソースがあるでしょうか? ヒント: パイプやgrepの使い方が分からない場合は 『コマンドライン編』の 「grepで検索する」を参考にしてみてください。

```
ubuntu:~/environment/sample_app (basic-login) $ rails routes | grep sessions#                         
sessions_new GET /sessions/new(.:format)   sessions#new                                                               
login GET    /login(.:format) sessions#new                                                                        
      POST   /login(.:format) sessions#create                                                                    
loguniELETE /logout(.:format) sessions#destroy                                                                      
```
何がしたいのかわからない。