Closed yutokyokutyo closed 7 years ago
その下の郵便システムはHTTP同様ステートレスであり、対戦者同士が盤の状態を保持していれば、郵便システムや郵便配達夫が
??
名前付きルートである login_path に対して、GET でアクセスしているのか POST でアクセスしてきているのかの違い。
GET /login login_path new 新しいセッションのページ (ログイン) POST /login login_path create 新しいセッションの作成 (ログイン)
% rails routes | grep users (git)-[basic-login]
signup GET /signup(.:format) users#new
POST /signup(.:format) users#create
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
% rails routes | grep sessions (git)-[basic-login]
sessions_new GET /sessions/new(.:format) sessions#new
login GET /login(.:format) sessions#new
GET /login(.:format) sessions#create
GET /login(.:format) sessions#destroy
リスト 8.4で定義したフォームで送信すると、Sessionsコントローラのcreateアクションに到達します。Railsはこれをどうやって実現しているでしょうか? 考えてみてください。ヒント:表 8.1とリスト 8.5の1行目に注目してください。
/login に POST が渡ってる -> create アクションに到達する....。
Railsコンソールを使って、表 8.2のそれぞれの式が合っているか確かめてみましょう. まずはuser = nilの場合を、次にuser = User.firstとした場合を確かめてみてください。ヒント: 必ず論理値オブジェクトとなるように、4.2.3で紹介した!!のテクニックを使ってみましょう。例: !!(user && user.authenticate(’foobar’))
irb(main):006:0> user = nil
=> nil
irb(main):007:0> !!(user && user.authenicate('footer'))
=> false
irb(main):008:0> user = User.first
User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? [["LIMIT", 1]]
=> #<User id: 1, name: "Yuto Kondo", email: "k.yuto.cre@gmail.com", created_at: "2017-04-01 08:11:37", updated_at: "2017-04-02 07:05:18", password_digest: "$2a$10$.Y0rWmKxkaw9jiUvWTKDdOTLKhdWVWbSRwSyeCY/N4m...">
irb(main):011:0> !!(user && user.authenticate('foobar'))
=> true
Gravatarとはメルアドで連携してるからこういうこともあるんだろうなぁw
元気な肺
Railsコンソールを使って、User.find_by(id: ...)で対応するユーザーが検索に引っかからなかったとき、nilを返すことを確認してみましょう。 先ほどと同様に、今度は:user_idキーを持つsessionハッシュを作成してみましょう。リスト 8.17に記したステップにしたがって、||=演算子がうまく動くことも確認してみましょう。
irb(main):001:0> session = {}
=> {}
irb(main):002:0> @current_user ||= User.find_by(id: session[:user_id])
User Load (2.0ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ? [["LIMIT", 1]]
=> nil
irb(main):003: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):004:0> @current_user ||= User.find_by(id: session[:user_id])
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
=> #<User id: 1, name: "Yuto Kondo", email: "k.yuto.cre@gmail.com", created_at: "2017-04-01 08:11:37", updated_at: "2017-04-02 07:05:18", password_digest: "$2a$10$.Y0rWmKxkaw9jiUvWTKDdOTLKhdWVWbSRwSyeCY/N4m...">
irb(main):005:0> @current_user ||= User.find_by(id: session[:user_id])
=> #<User id: 1, name: "Yuto Kondo", email: "k.yuto.cre@gmail.com", created_at: "2017-04-01 08:11:37", updated_at: "2017-04-02 07:05:18", password_digest: "$2a$10$.Y0rWmKxkaw9jiUvWTKDdOTLKhdWVWbSRwSyeCY/N4m...">
試しにSessionヘルパーのlogged_in?メソッドから!を削除してみて、リスト 8.23が redになることを確認してみましょう。 先ほど削除した部分 (!) を元に戻して、テストが greenに戻ることを確認してみましょう。
% rails t test/integration/users_login_test.rb --name test_login_with_valid_information
Running via Spring preloader in process 7710
Started with run options --name test_login_with_valid_information --seed 21127
FAIL["test_login_with_valid_information", UsersLoginTest, 0.689485999988392]
test_login_with_valid_information#UsersLoginTest (0.69s)
Expected exactly 0 elements matching "a[href="/login"]", found 1..
Expected: 0
Actual: 1
test/integration/users_login_test.rb:25:in `block in <class:UsersLoginTest>'
1/1: [=============================================] 100% Time: 00:00:00, Time: 00:00:00
Finished in 0.72063s
1 tests, 4 assertions, 1 failures, 0 errors, 0 skips
[yuto@yutonoMacBook-Pro] ~/Project/rebuild_sample_app
% rails t test/integration/users_login_test.rb --name test_login_with_valid_information
Running via Spring preloader in process 7733
Started with run options --name test_login_with_valid_information --seed 3449
1/1: [=============================================] 100% Time: 00:00:00, Time: 00:00:00
Finished in 0.70250s
1 tests, 6 assertions, 0 failures, 0 errors, 0 skips
完!
「には」? これは誤字かな?チャンス!