目的
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にアクセスしたときの振る舞いについて図を書いてみてください。
<解答>
演習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に入力した状態で、マイクロポストを作成しようとするとどうなるでしょうか? (ヒント: WikipediaのRubyの記事にある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文字以上を入力してみましょう。どのように振る舞いが変わったでしょうか?
<解答>
エラー表示
演習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で加えたバリデーションが本番環境でもうまく動くかどうか、確認してみてください
<解答>
問題文の通り実行し、動作確認のみなので省略。