Ruby on Rails Tutorial 8章

演習
1
GET login_pathとPOST login_pathとの違いを説明できますか? 少し考えてみましょう。
2
ターミナルのパイプ機能を使ってrails routesの実行結果とgrepコマンドを繋ぐことで、Usersリソースに関するルーティングだけを表示させることができます。同様にして、Sessionsリソースに関する結果だけを表示させてみましょう。現在、いくつのSessionsリソースがあるでしょうか? ヒント: パイプやgrepの使い方が分からない場合は Learn Enough Command Line to Be Dangerousの Section on Grep (英語) を参考にしてみてください。


1

  get    '/login',   to: 'sessions#new' NEW  newアクションを要求
  post   '/login',   to: 'sessions#create'　
progateで（その内容では）POSTはサーバーに畳を送るとき必要と覚えておけばいいとあるようにcreateアクションで使うデータをサーバーへ送る
  

2

```
  
ec2-user:~/environment/sample_app (basic-login) $ rails routes | grep sessions
    login GET    /login(.:format)          sessions#new
          POST   /login(.:format)          sessions#create
   logout DELETE /logout(.:format)         sessions#destroy
ec2-user:~/environment/sample_app (basic-login) $ 

```

8.1.2

演習
リスト 8.4で定義したフォームで送信すると、Sessionsコントローラのcreateアクションに到達します。Railsはこれをどうやって実現しているでしょうか? 考えてみてください。ヒント:表 8.1とリスト 8.5の１行目に注目してください。

action="/login" method="post">の部分


8.1.3
演習
Railsコンソールを使って、表 8.2のそれぞれの式が合っているか確かめてみましょう. まずはuser = nilの場合を、次にuser = User.firstとした場合を確かめてみてください。ヒント: 必ず論理値オブジェクトとなるように、4.2.3で紹介した!!のテクニックを使ってみましょう。例: !!(user && user.authenticate(’foobar’))


```

>> user = nil
=> nil
>> !!(user && user.authenticate(’foobar’))
=> false
>> use=User.first
  User Load (0.1ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2019-04-13 05:30:47", updated_at: "2019-04-13 05:30:47", password_digest: "$2a$10$gr18EYrgzmjFoagV/HyQXuXMbr7DZgH5Y.kPFwBibpn...">
>> !!(user && user.authenticate(’foobar’))
=> false
>> !!(user && user.authenticate(’123456’))
=> true

```

8.1.5

演習
8.1.4の処理の流れが正しく動いているかどうか、ブラウザで確認してみてください。特に、flashがうまく機能しているかどうか、フラッシュメッセージの表示後に違うページに移動することを忘れないでください。

![railschapter80_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368629/1d82ba30-928f-4d5b-86dd-08b01057824d.png)



8.2.1

演習
有効なユーザーで実際にログインし、ブラウザからcookiesの情報を調べてみてください。このとき、sessionの値はどうなっているでしょうか? ヒント: ブラウザでcookiesを調べる方法が分からない? 今こそググってみるときです! (コラム 1.1)
先ほどの演習課題と同様に、Expiresの値について調べてみてください。
![rails chapter802No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368629/12cdea0c-3836-ce8f-f031-645211775fe4.png)


8.2.2

演習
Railsコンソールを使って、User.find_by(id: ...)で対応するユーザーが検索に引っかからなかったとき、nilを返すことを確認してみましょう。
先ほどと同様に、今度は:user_idキーを持つsessionハッシュを作成してみましょう。リスト 8.17に記したステップに従って、||=演算子がうまく動くことも確認してみましょう。

```

>> User.find_by(id:100)
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 100], ["LIMIT", 1]]
=> nil

2

>> session = {}                                                              
=> {}
>> session[:user_id]=nil
=> nil
>> @current_user ||= User.find_by(id: session[:user_id])
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ?  [["LIMIT", 1]]
=> nil
>> session[:user_id]=User.first.id
  User Load (0.1ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> 1
>> @current_user ||=User.find_by(id: session[:user_id])
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2019-04-13 05:30:47", updated_at: "2019-04-13 05:30:47", password_digest: "$2a$10$gr18EYrgzmjFoagV/HyQXuXMbr7DZgH5Y.kPFwBibpn...">
>> @current_user ||=User.find_by(id: session[:user_id])
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2019-04-13 05:30:47", updated_at: "2019-04-13 05:30:47", password_digest: "$2a$10$gr18EYrgzmjFoagV/HyQXuXMbr7DZgH5Y.kPFwBibpn...">
>> 

```


8.2.3

演習
ブラウザのcookieインスペクタ機能を使って (8.2.1.1)、セッション用のcookieを削除してみてください。ヘッダー部分にあるリンクは非ログイン状態のものになっているでしょうか? 確認してみましょう。
もう一度ログインしてみて、ヘッダーのレイアウトが変わったことを確認してみましょう。その後、ブラウザを再起動させ、再び非ログイン状態に戻ったことも確認してみてください。注意: もしブラウザの [閉じたときの状態に戻す] 機能をオンにしていると、セッション情報も復元される可能性があります。もしその機能をオンにしている場合、忘れずにオフにしておきましょう (コラム 1.1)。

確認

8.2.4
演習
試しにSessionヘルパーのlogged_in?メソッドから!を削除してみて、リスト 8.23が redになることを確認してみましょう。
先ほど削除した部分 (!) を元に戻して、テストが greenに戻ることを確認してみましょう。

確認

8.2.5

演習
リスト 8.25のlog_inの行をコメントアウトすると、テストスイートは red になるでしょうか? それとも green になるでしょうか? 確認してみましょう。
現在使っているテキストエディタの機能を使って、リスト 8.25をまとめてコメントアウトできないか調べてみましょう。また、コメントアウトの前後でテストスイートを実行し、コメントアウトすると red に、コメントアウトを元に戻すと green になることを確認してみましょう。ヒント: コメントアウト後にファイルを保存することを忘れないようにしましょう。また、テキストエディタのコメントアウト機能については Test Editor Tutorial の Commenting Out (英語) などを参照してみてください。

```

ec2-user:~/environment/sample_app (basic-login) $ rails test
Running via Spring preloader in process 27412
Started with run options --seed 46241

ERROR["test_invalid_signup_information", UsersSignupTest, 0.458157080996898]
 test_invalid_signup_information#UsersSignupTest (0.46s)
ActionController::RoutingError:         ActionController::RoutingError: No route matches [POST] "/signup"
            test/integration/users_signup_test.rb:8:in `block (2 levels) in <class:UsersSignupTest>'
            test/integration/users_signup_test.rb:7:in `block in <class:UsersSignupTest>'

  21/21: [==============================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.61125s
21 tests, 45 assertions, 0 failures, 1 errors, 0 skips

```

2
AWSはCtrl+/でまとめてコメントアウト

8.3
演習
ブラウザから [Log out] リンクをクリックし、どんな変化が起こるか確認してみましょう。また、リスト 8.31で定義した３つのステップを実行してみて、うまく動いているかどうか確認してみましょう。
cookiesの内容を調べてみて、ログアウト後にはsessionが正常に削除されていることを確認してみましょう。

1

ログアウトするとルートディレクトリへ移動　ログアウト済み確認

２確認