Railsチュートリアル 第8章

8.1 セッション

8.1.1

演習1

省略.

演習2

routes.rbに記述したルーティングのみが表示されました.

8.1.2

演習1

routes.rbにおける設定

post '/login', to: 'sessions#create'

により実現されていますね.

8.1.3

演習1

省略.

8.1.4

Flashメッセージについて今ひとつよくわからなかったので, Railsガイドを参照しました.

flashはセッションの中の特殊な部分であり、リクエストごとにクリアされます。この特徴から、flashは「直後のリクエスト」でのみ参照可能になります。

これを踏まえて, Flashメッセージが残ってしまう理由を説明しましょう.

ログインボタンを押すことにより, /loginに対しPOSTリクエストが送られます. このとき変数flashにエラーメッセージが格納されます.

これと同時にnewページがレンダリングされますが, これは同一のPOSTリクエストの中で行われます.

上の引用文からもわかるように, 次のリクエストでもまだ変数flashにエラーメッセージは格納されたままです. だからHomeページに移動してもフラッシュメッセージが表示されたままなのです.

次にHelpページなどにアクセスし, もう一度HTTPリクエストを送ることにより, やっとflashの中身がクリアされます.

8.1.5

演習1

flash.nowがうまく機能していることがブラウザ上でも確認できます.

8.2 ログイン

Applicationコントローラの定義内に, 追加した覚えのないメソッドがある...どこかで見落としたのでしょうか.

# app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception # 見知らぬ行
    include SessionHelper
end

8.2.1

演習1

Sxi%2FKPGHw...のような暗号化された値で保存されていますね.

演習2

有効期限の欄にはセッションと書かれています.

8.2.2

演習1

たしかにnilが返ってきます.

irb(main):003:0> User.find_by(id: 2)
  User Load (0.9ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
=> nil

演習2

以下のようになりました. 例外を発生させないことと, 2回目にデータベースへの問い合わせが無いことが確認できますね.

>> session = {}
=> {}
>> session[:user_id] = nil
=> nil

>> @current_user ||= User.find_by(id: session[:user_id])
   (0.6ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
  User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
=> nil

>> session[:user_id] = User.first.id
  User Load (0.5ms)  SELECT  `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
=> 1

>> @current_user ||= User.find_by(id: session[:user_id])
  User Load (1.2ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2018-06-28 05:35:56", updated_at: "2018-06-28 05:35:56", password_digest: "$2a$10$i8HBze1p.5miIytb9ahZjefM27b8EXVMSMjV/B0za7t...">

>> @current_user ||= User.find_by(id: session[:user_id])
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2018-06-28 05:35:56", updated_at: "2018-06-28 05:35:56", password_digest: "$2a$10$i8HBze1p.5miIytb9ahZjefM27b8EXVMSMjV/B0za7t...">

8.2.3

Bootstrapのドロップダウンがうまく機能しません. 何行かコードを追加すると動くという記事もありましたが, 浅い理解でコードを書き換えるのも嫌なので後回しにします.

と思ったらただのタイポでした. ではBootstrapが動かないと報告している記事はなんだったんでしょう.

演習1, 2

省略.

8.2.4

演習1, 2

省略.

8.2.5

演習1, 2

省略.

8.3 ログアウト

演習1

省略.

演習2

ログアウトと同時にcookieの値が変化していることがわかります.