新米パパの育児留学

新米パパの育児留学

『育児留学』とは、育児を通して異なる視点を得たり新しいことに挑戦して自己成長に繋げること。育児奮闘中の新米パパが育児を通して得た気づきや感じたこと、育休中に習得したプログラミングに関する話題を発信していきます。

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

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

目的

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版)に関しては検索しても出てきませんでした。

演習問題と解答

演習2.2.1

演習2.2.1.1

<問題> CSSを知っている読者へ: 新しいユーザーを作成し、ブラウザのHTMLインスペクター機能を使って「User was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?

<解答>

表示が消える

演習2.2.1.2

<問題> emailを入力せず、名前だけを入力しようとした場合、どうなるでしょうか?

<解答>

エラーなく、登録成功してしまう "User was successfully created."

演習2.2.1.3

<問題> 「@example.com」のような間違ったメールアドレスを入力して更新しようとした場合、どうなるでしょうか?

<解答>

エラーなく、登録成功してしまう "User was successfully created."

演習2.2.1.4

<問題> 上記の演習で作成したユーザーを削除してみてください。ユーザーを削除したとき、Railsはどんなメッセージを表示するでしょうか?

<解答>

"User was successfully destroyed."

演習2.2.2

演習2.2.2.1

<問題> 図 2.11を参考にしながら、/users/1/edit というURLにアクセスしたときの振る舞いについて図を書いてみてください。

<解答>

f:id:mochikichi321:20170207160112p:plain

演習2.2.2.2

<問題> 図示した振る舞いを見ながら、Scaffoldで生成されたコードの中でデータベースからユーザー情報を取得しているコードを探してみてください。

<解答>

以下の"@user = User.find(params[:id])"

[users_controller.rb]

class UsersController < ApplicationController
(中略)
  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end
end

演習2.2.2.3

<問題> ユーザーの情報を編集するページのファイル名は何でしょうか?

<解答>

"users/edit.html.erb"

演習2.3.1

演習2.3.1.1

<問題> CSSを知っている読者へ: 新しいユーザーを作成し、ブラウザのHTMLインスペクター機能を使って「Micropost was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?

<解答>

表示が消える

演習2.3.1.2

<問題> マイクロポストの作成画面で、ContentもUserも空にして作成しようとするどうなるでしょうか?

<解答>

エラーなく、登録成功してしまう "User was successfully created."

演習2.3.1.3

<問題> 141文字以上の文字列をContentに入力した状態で、マイクロポストを作成しようとするとどうなるでしょうか? (ヒント: WikipediaRubyの記事にある1段落目がちょうど150文字程度ですが、どうなりますか?)

<解答>

エラーなく、登録成功してしまう "User was successfully created."

演習2.3.1.4

<問題> 上記の演習で作成したマイクロポストを削除してみましょう。

<解答>

"Micropost was successfully destroyed."

演習2.3.2

演習2.3.2.1

<問題> 先ほど2.3.1.1の演習でやったように、もう一度Contentに141文字以上を入力してみましょう。どのように振る舞いが変わったでしょうか?

<解答>

エラー表示

f:id:mochikichi321:20170207160408p:plain

演習2.3.2.2

<問題> CSSを知っている読者へ: ブラウザのHTMLインスペクター機能を使って、表示されたエラーメッセージを調べてみてください。

<解答>

省略

演習2.3.3

演習2.3.3.1

<問題> ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。同ファイル内の他のコードから文法を推測してみてください (コラム 1.1で紹介した技術の出番です)。うまく表示できたかどうか、/users/1 にアクセスして確認してみましょう。

<解答>

"@micropost = Micropost.find(params[:id])"を追加。

[users_controller.rb]

class UsersController < ApplicationController
(中略)
  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
      @micropost = Micropost.find(params[:id])
    end
end

"<%= @micropost.content %>"を追加

[users_show.html.erb]

(前略)
<p>
  <strong>Content:</strong>
  <%= @micropost.content %>
</p>
(後略)

演習2.3.3.2

<問題> リスト 2.16は、マイクロポストのContentが存在しているかどうかを検証するバリデーションです。マイクロポストが空でないことを検証できているかどうか、実際に試してみましょう (図 2.16のようになっていると成功です)。

<解答>

リスト 2.16参照。

演習2.3.3.3

<問題> リスト 2.17のFILL_INとなっている箇所を書き換えて、Userモデルのnameとemailが存在していることを検証してみてください (図 2.17)。

<解答>

[app/models/user.rb]

class User < ApplicationRecord
  has_many :microposts
  validates :name, presence: true
  validates :email, presence: true
end

演習2.3.4

演習2.3.4.1

<問題> Applicationコントローラのファイルを開き、ApplicationControllerがActionController::Baseを継承している部分のコードを探してみてください。

<解答>

下記ファイルの一番上のコードです。

[application_controller.rb]

class ApplicationController < ActionController::Base
(後略)

演習2.3.4.2

<問題> ApplicationRecordがActiveRecord::Baseを継承しているコードはどこにあるでしょうか? 先ほどの演習を参考に、探してみてください。ヒント: コントローラと本質的には同じ仕組みなので、app/modelsディレクトリ内にあるファイルを調べてみると...?)

<解答>

下記ファイルの一番上のコードです。

[app/models/application_record.rb]

class ApplicationRecord < ActiveRecord::Base
(後略)

演習2.3.5

演習2.3.5.1~3

<問題>

①本番環境で2〜3人のユーザーを作成してみましょう。

②本番環境で最初のユーザーのマイクロポストを作ってみましょう

③マイクロポストのContentに141文字以上を入力した状態で、マイクロポストを作成してみましょう。リスト 2.13で加えたバリデーションが本番環境でもうまく動くかどうか、確認してみてください

<解答>

問題文の通り実行し、動作確認のみなので省略。

関連記事

mochikichi.hatenablog.com