yutokyokutyo / rebuild_sample_app

https://railstutorial.jp/chapters/static_pages?version=5.0#cha-static_pages
https://rebuildsampleapp.herokuapp.com/
5 stars 0 forks source link

8章 #11

Closed yutokyokutyo closed 7 years ago

yutokyokutyo commented 7 years ago

ユーザーのIDを保持しておく手段がHTTPプロトコル内「には」まったくありません。ユーザーログインの

「には」? これは誤字かな?チャンス!

yutokyokutyo commented 7 years ago

その下の郵便システムはHTTP同様ステートレスであり、対戦者同士が盤の状態を保持していれば、郵便システムや郵便配達夫が

??

yutokyokutyo commented 7 years ago

8.1.1

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

名前付きルートである login_path に対して、GET でアクセスしているのか POST でアクセスしてきているのかの違い。

GET /login login_path new 新しいセッションのページ (ログイン) POST /login login_path create 新しいセッションの作成 (ログイン)

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

8.1.2

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

POST /login login_path create

/login に POST が渡ってる -> create アクションに到達する....。

yutokyokutyo commented 7 years ago

8.1.3

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
yutokyokutyo commented 7 years ago

奇跡w

Gravatarとはメルアドで連携してるからこういうこともあるんだろうなぁw

image

june29 commented 7 years ago

元気な肺

yutokyokutyo commented 7 years ago

20100213192209

yutokyokutyo commented 7 years ago

8.2.2

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...">
yutokyokutyo commented 7 years ago

8.2.4

試しに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
yutokyokutyo commented 7 years ago

完!