Fendo181 / RoRTutorial_chap04

0 stars 0 forks source link

演習8 #28

Closed Fendo181 closed 7 years ago

Fendo181 commented 7 years ago

8.1.1

(1)

GET login_pathとPOST login_pathとの違いを説明できますか? 少し考えてみましょう。

# GETはlogin
GET    /login(.:format)          sessions#new
#POSはcreate
POST   /login(.:format)          sessions#create

(2)

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

rails routes | grep users#

PMAC416S:rails_chap04 futoshi.endo$ rails routes | grep session
login GET    /login(.:format)          sessions#new
POST   /login(.:format)          sessions#create
logout DELETE /logout(.:format)         sessions#destroy
Fendo181 commented 7 years ago

8.1.2

(1)

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

<form accept-charset="UTF-8" action="/login" method="post">でPOSTで/loginにアクセスすると、表8.1より、createアクションが実行されます。

Fendo181 commented 7 years ago

8.1.3

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

user = nilの場合

irb(main):004:0> user = nil
=> nil
irb(main):005:0> user && (user.authenticate('foobar'))
=> nil
irb(main):006:0> !!user && (user.authenticate('foobar'))
=> false

user = first

正しいPWは`hogehoge

irb(main):010:0> user = User.find(2)
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
=> #<User id: 2, name: "takahasi", email: "efef1201@yahoo.co.jp", created_at: "2017-07-04 05:00:13", updated_at: "2017-07-04 05:00:13", password_digest: "$2a$10$WpRtgJmtjHL0xBFzQCvZ2e6Thk1nP
i3nxvJsTFzyIub...">

irb(main):011:0> user && user.authenticate('foobar')
=> false

irb(main):012:0> user && user.authenticate('hogehoge')
## 正しい結果が帰ってくる。
=> #<User id: 2, name: "takahasi", email: "efef1201@yahoo.co.jp", created_at: "2017-07-04 05:00:13", updated_at: "2017-07-04 05:00:13", password_digest: "$2a$10$WpRtgJmtjHL0xBFzQCvZ2e6Thk1nP
i3nxvJsTFzyIub...">

!!(user && user.authenticate('hogehoge'))
=> true

 !!(user && user.authenticate('fugafuga'))
=> false
Fendo181 commented 7 years ago

8.2.2

(1)

有効なユーザーで実際にログインし、ブラウザからcookiesの情報を調べてみてください。このとき、sessionの値はどうなっているでしょうか? ヒント: ブラウザでcookiesを調べる方法が分からない? 今こそググってみるときです! (コラム 1.1)

Kobito.qpQ8Yn.png

(2)

先ほどの演習課題と同様に、Expiresの値について調べてみてください。

ブラウザセッション終了時

Fendo181 commented 7 years ago

8.2.3

Railsコンソールを使って、User.find_by(id: ...)で対応するユーザーが検索に引っかからなかったとき、nilを返すことを確認してみましょう。

irb(main):006:0> User.find_by(id:10)
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 10], ["LIMIT", 1]]
=> nil

先ほどと同様に、今度は:user_idキーを持つsessionハッシュを作成してみましょう。リスト 8.17に記したステップにしたがって、||=演算子がうまく動くことも確認してみましょう。

irb(main):008:0> @current_user ||= User.find_by(id:1)
=> #<User id: 1, name: "Rails Tutoria", email: "example@railstutorial.org", created_at: "2017-07-03 06:23:15", updated_at: "2017-07-03 06:23:15", password_digest: "$2a$10$DzQyr3.mrFDFk2cblWz
x7euISB2hDgL1k3.ajC.hQFz...">

irb(main):009:0> @current_user ||= User.find_by(id:5)
=> #<User id: 1, name: "Rails Tutoria", email: "example@railstutorial.org", created_at: "2017-07-03 06:23:15", updated_at: "2017-07-03 06:23:15", password_digest: "$2a$10$DzQyr3.mrFDFk2cblWz
x7euISB2hDgL1k3.ajC.hQFz...">

@current_userにはすでに値が入っており、短絡評価 (short-circuit evaluation) より、値がそれ以降入力されない。

irb(main):003:0> @current_user ||= User.find_by(id: session[:user_id])
  User Load (2.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ?  [["LIMIT", 1]]
=> nil
irb(main):004:0> session[:user_id]= User.first.id
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> 1
irb(main):005:0> @current_user ||= User.find_by(id: session[:user_id])
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
=> #<User id: 1, name: "Rails Tutoria", email: "example@railstutorial.org", created_at: "2017-07-03 06:23:15", updated_at: "2017-07-03 06:23:15", password_digest: "$2a$10$DzQyr3.mrFDFk2cblWz
x7euISB2hDgL1k3.ajC.hQFz...">
irb(main):006:0> @current_user ||= User.find_by(id: session[:user_id])
=> #<User id: 1, name: "Rails Tutoria", email: "example@railstutorial.org", created_at: "2017-07-03 06:23:15", updated_at: "2017-07-03 06:23:15", password_digest: "$2a$10$DzQyr3.mrFDFk2cblWz
x7euISB2hDgL1k3.ajC.hQFz...">
Fendo181 commented 7 years ago

8.2.4

(1)

ブラウザのcookieインスペクタ機能を使って (8.2.1.1)、セッション用のcookieを削除してみてください。ヘッダー部分にあるリンクは非ログイン状態のものになっているでしょうか? 確認してみましょう。

(1) ログインしました。

Kobito.n0z2ru.png

(2) cookieからセッションを消す。

Kobito.HnmS03.png

(3) heder部分からloginが消えて、Accountに変わりました。

Kobito.e0c83X.png

(2)

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

省略