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の値が変化していることがわかります.