Closed Fendo181 closed 7 years ago
(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アクションが実行されます。
(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
(1)
有効なユーザーで実際にログインし、ブラウザからcookiesの情報を調べてみてください。このとき、sessionの値はどうなっているでしょうか? ヒント: ブラウザでcookiesを調べる方法が分からない? 今こそググってみるときです! (コラム 1.1)
(2)
先ほどの演習課題と同様に、Expiresの値について調べてみてください。
ブラウザセッション終了時
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...">
(1)
ブラウザのcookieインスペクタ機能を使って (8.2.1.1)、セッション用のcookieを削除してみてください。ヘッダー部分にあるリンクは非ログイン状態のものになっているでしょうか? 確認してみましょう。
(1) ログインしました。
(2) cookieからセッションを消す。
(3) heder部分からloginが消えて、Accountに変わりました。
(2)
もう一度ログインしてみて、ヘッダーのレイアウトが変わったことを確認してみましょう。その後、ブラウザを再起動させ、再び非ログイン状態に戻ったことも確認してみてください。注意: もしブラウザの [閉じたときの状態に戻す] 機能をオンにしていると、セッション情報も復元される可能性があります。もしその機能をオンにしている場合、忘れずにオフにしておきましょう (コラム 1.1)。
省略
8.1.1
(1)
(2)