第2章Railsチュートリアル演習問題と解答まとめ

Ruby on Railsチュートリアルの演習問題と解答をまとめる。


第2章 Toyアプリケーション - Railsチュートリアル

f:id:yukitoku_sw:20191019165508p:plain

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


演習2.2.1

問題1

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

解答

消える。。


問題2

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

解答

「User was successfully created.」となる。
emailなしでもユーザー登録可能


問題3

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

解答

「User was successfully created.」となる。
間違ったメールアドレスでも登録可能


問題4

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

解答

「Are you sure?」という確認が表示される
「ok」を押すと
「User was successfully destroyed.」と表示される


演習2.2.2

問題1

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

解答

f:id:yukitoku_sw:20191019153914p:plain


問題2

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

解答

[app/controllers/users_controller.rb]

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]

 (中略)

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])       <-- この部分
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params.require(:user).permit(:name, :email)
    end
end


問題3

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

解答

[app/views/users/edit.html.erb]


演習2.3.1

問題1

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

解答

消える。。


問題2

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

解答

「Micropost was successfully created.」 空のデータが保存されてしまう


問題3

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

解答

「Micropost was successfully created.」 文字数に関係なく保存が成功する


問題4

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

解答

「Micropost was successfully destroyed.」


演習2.3.2

問題1

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

解答

エラーが表示されマイクロポストを保存することができない
f:id:yukitoku_sw:20191019161219p:plain


問題2

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

解答

というdivタグでエラーが表示されている。
リロードすると消える。


演習2.3.3

問題1

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

解答

[app/views/users/show.html.erb]
(前略)
<p>
  <strong>Email:</strong>
  <%= @user.email %>
</p>

# ここから <p> <strong>Microposts</strong> <%= @user.microposts.first.content %> </p> # ここまで追加

<%= link_to 'Edit', edit_user_path(@user) %> | <%= link_to 'Back', users_path %>


問題2

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

解答

リスト2.16, 図2.16参照


問題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

問題1

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

解答

[app/controllers/application_controller.rb]

class ApplicationController < ActionController::Base (中略) end


問題2

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

解答

[app/models/application_record.rb]

class ApplicationRecord < ActiveRecord::Base self.abstract_class = true end


演習2.3.5

問題1

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

問題2

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

問題3

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

解答

上記3つはそのままなので省略


おわり!


yukitoku-sw.hatenablog.com