読者です 読者をやめる 読者になる 読者になる

新米パパの育児留学

子供との幸せな時間を今だけではなく、一生大切にしたいという思いから、育休中にプログラミングを学習しエンジニアを目指します。

【第8章】Ruby on Rails チュートリアル 5.0(第4版)演習と解答まとめ

プログラミング プログラミング-Rails_チュートリアル

Ruby on Rails Tutorial最新版の演習と解答です。

f:id:mochikichi321:20170206212242p:plain

目的

Ruby on Rails チュートリアル 5.0(第4版)を学習中です。

学習を進める中で演習問題の解答がなかった(*1,2)ので、自分なりにまとめていくこととしました。

アウトプットし、自分の理解を深めることを目的としています。 もし、記載内容に誤りがあった場合はコメントいただけると幸いです。

(*1)著者による有償版の解答はあるようです。正式な解答をご希望の方はこちらを参照ください。

Learn Web Development with Rails: Michael Hartl's Ruby on Rails Tutorial | Softcover.io

(*2)旧版に関する解答はありましたが、最新版 5.0(第4版)に関しては検索しても出てきませんでした。

プログラミングを学習し始めたきっかけについてはこちら

mochikichi.hatenablog.com

演習問題と解答

演習8.1.1

演習8.1.1.1

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

<解答> リスト 8.2より、

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

GET login_path: “/login"へアクセスされた際に"session#new"アクションを実行

POST login_path: “session#create"アクションの情報を”/login"へ送信

以下の「コラム 3.2. GETやその他のHTTPメソッドについて」を参照。

https://railstutorial.jp/chapters/static_pages?version=5.0#aside-get_etc

演習8.1.1.2

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

<解答>

$ rails routes | grep users#
   signup GET    /signup(.:format)         users#new
    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#
    login GET    /login(.:format)          sessions#new
          POST   /login(.:format)          sessions#create
   logout DELETE /logout(.:format)         sessions#destroy

Sessionsリソースは「3つ」です。

参考:

パイプ「|」を使って 複数のコマンドを組み合わせる:http://webkaru.net/linux/commands-pipeline/

grepコマンド:https://hydrocul.github.io/wiki/commands/grep.html

演習8.1.2

演習8.1.2.1

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

<解答> リスト8.5の1行目の以下部分で、

action="/login" method="post"

表8.1の以下のcreateアクションに到達することがわかる。 [POST /login login_path create 新しいセッションの作成 (ログイン)]

演習8.1.3

演習8.1.3.1

<問題> Railsコンソールを使って、表 8.2のそれぞれの式が合っているか確かめてみましょう. まずはuser = nilの場合を、次にuser = User.firstとした場合を確かめてみてください。ヒント: 必ず論理値オブジェクトとなるように、4.2.3で紹介した!!のテクニックを使ってみましょう。例: !!(user && user.authenticate(’foobar’))

<解答> [(nil && [オブジェクト]) == false]の確認。

>> user=nil
=> nil

>> !!(user && user.authenticate(’foobar’))
=> false

[(true && false) == false]の確認。(正しいパスワードは[123456])

>> user=User.first
  User Load (1.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2017-02-09 07:39:54", updated_at: "2017-02-09 07:39:54", password_digest: "$2a$10$NCGVBX5axnKjyHVDxfUo5eco71WXZlmOX/9/gfBb2Gm...">

>> !!(user && user.authenticate('111111'))
=> false

[(true && true) == true]の確認。(正しいパスワードは[123456])

>> !!(user && user.authenticate('123456'))
=> true

演習8.1.5

演習8.1.5.1

<問題> 8.1.4の処理の流れが正しく動いているかどうか、ブラウザで確認してみてください。特に、flashがうまく機能しているかどうか、フラッシュメッセージの表示後に違うページに移動することを忘れないでください。

<解答> 動作確認のみなので省略。

演習8.2.1

演習8.2.1.1

<問題> 有効なユーザーで実際にログインし、ブラウザからcookiesの情報を調べてみてください。このとき、sessionの値はどうなっているでしょうか? ヒント: ブラウザでcookiesを調べる方法が分からない? 今こそググってみるときです! (コラム 1.1)

<解答> f:id:mochikichi321:20170225202336p:plain

演習8.2.1.2

<問題> 先ほどの演習課題と同様に、Expiresの値について調べてみてください。

<解答> 有効期限:ブラウザセッションの終了時(演習8.2.1.1の画像参照)

演習8.2.2

演習8.2.2.1

<問題> Railsコンソールを使って、User.find_by(id: …)で対応するユーザーが検索に引っかからなかったとき、nilを返すことを確認してみましょう。

<解答>

idは1のみ存在する状態で以下を実行。id:1はtrue,id:2はnil

>> User.find_by(id:1)
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2017-02-09 07:39:54", updated_at: "2017-02-09 07:39:54", password_digest: "$2a$10$NCGVBX5axnKjyHVDxfUo5eco71WXZlmOX/9/gfBb2Gm...">

>> User.find_by(id:2)
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
=> nil

演習8.2.2.2

<問題> 先ほどと同様に、今度は:user_idキーを持つsessionハッシュを作成してみましょう。リスト 8.17に記したステップにしたがって、||=演算子がうまく動くことも確認してみましょう。

<解答>

>> session = {}
=> {}
>> session[:user_id] = nil
=> nil
>> @current_user ||= User.find_by(id: session[:user_id])
=> nil
>> session[:user_id]= User.first.id
=> 1
>> @current_user ||= User.find_by(id: session[:user_id])
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2017-02-09 07:39:54", updated_at: "2017-02-09 07:39:54", password_digest: "$2a$10$NCGVBX5axnKjyHVDxfUo5eco71WXZlmOX/9/gfBb2Gm...">
>> @current_user ||= User.find_by(id: session[:user_id])
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2017-02-09 07:39:54", updated_at: "2017-02-09 07:39:54", password_digest: "$2a$10$NCGVBX5axnKjyHVDxfUo5eco71WXZlmOX/9/gfBb2Gm...">

演習8.2.3

演習8.2.3.1

<問題> ブラウザのcookieインスペクタ機能を使って (8.2.1.1)、セッション用のcookieを削除してみてください。ヘッダー部分にあるリンクは非ログイン状態のものになっているでしょうか? 確認してみましょう。

<解答> 動作確認のみなので省略。

演習8.2.3.2

<問題> もう一度ログインしてみて、ヘッダーのレイアウトが変わったことを確認してみましょう。その後、ブラウザを再起動させ、再び非ログイン状態に戻ったことも確認してみてください。注意: もしブラウザの [閉じたときの状態に戻す] 機能をオンにしていると、セッション情報も復元される可能性があります。もしその機能をオンにしている場合、忘れずにオフにしておきましょう (コラム 1.1)。

<解答> 動作確認のみなので省略。

演習8.2.4

演習8.2.4.1

<問題> 試しにSessionヘルパーのlogged_in?メソッドから!を削除してみて、リスト 8.23が redになることを確認してみましょう。

<解答> 動作確認のみなので省略。

演習8.2.4.1

<問題> 先ほど削除した部分 (!) を元に戻して、テストが greenに戻ることを確認してみましょう。

<解答> 動作確認のみなので省略。

演習8.2.5

演習8.2.5.1

<問題> リスト 8.25のlog_inの行をコメントアウトすると、テストスイートは red になるでしょうか? それとも green になるでしょうか? 確認してみましょう。

<解答> RED

演習8.2.5.2

<問題> 現在使用しているテキストエディタの機能を使って、リスト 8.25をまとめてコメントアウトできないか調べてみましょう。また、コメントアウトの前後でテストスイートを実行し、コメントアウトすると red に、コメントアウトを元に戻すと green になることを確認してみましょう。ヒント: コメントアウト後にファイルを保存することを忘れないようにしましょう。また、テキストエディタコメントアウト機能については Test Editor Tutorial の Commenting Out (英語) などを参照してみてください。

<解答> 動作確認のみなので省略。

演習8.3

演習8.3.1

<問題> ブラウザから [Log out] リンクをクリックし、どんな変化が起こるか確認してみましょう。また、リスト 8.31で定義した3つのステップを実行してみて、うまく動いているかどうか確認してみましょう。

<解答> 動作確認のみなので省略。

演習8.3.2

<問題> cookiesの内容を調べてみて、ログアウト後にはsessionが正常に削除されていることを確認してみましょう。

<解答> 動作確認のみなので省略。

関連記事

mochikichi.hatenablog.com

mochikichi.hatenablog.com

mochikichi.hatenablog.com

mochikichi.hatenablog.com

mochikichi.hatenablog.com

mochikichi.hatenablog.com

mochikichi.hatenablog.com