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

目的

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

Ruby on Rails チュートリアル 6.0(第6版)を学習中です。
学習を進める中で演習問題の解答を自分なりにまとめていくことにしました。

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

演習問題と解答

演習3.1

演習3.1.1

<問題>Markdown記法のREADME(リスト 3.3)がHTMLとして正しくGitHub上で描画されているか、確認してみてください。

<解答>

演習3.1.2

<問題>本番環境(Heroku)のルートURLにアクセスして、デプロイが成功したかどうか確かめてみてください。

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

演習3.2.1

演習3.2.1.1

<問題>Fooというコントローラを生成し、その中にbarとbazアクションを追加してみてください。

<解答>

rails g controller Foo bar baz

演習3.2.1.2

<問題>コラム 3.1で紹介したテクニックを駆使して、Fooコントローラとそれに関連するアクションを削除してみてください。

<解答>

rails d controller Foo bar baz

演習3.3.1

<問題>StaticPagesコントローラのテスト(リスト 3.25)には、いくつか繰り返しがあったことにお気づきでしょうか? 特に「Ruby on Rails Tutorial Sample App」という基本タイトルは、各テストで毎回同じ内容を書いてしまっています。そこで、setupという特別なメソッド(各テストが実行される直前で実行されるメソッド)を使って、この問題を解決したいと思います。まずは、リスト 3.31のテストが green になることを確認してみてください(リスト 3.31では、2.2.2で少し触れたインスタンス変数や文字列の式展開というテクニックを使っています。それぞれ4.4.5と4.2.1で詳しく解説するので、今はわからなくても問題ありません)。

<解答>

動作確認のみなので省略

演習3.4.2

<問題>サンプルアプリケーションにContact(問い合わせ先)ページを作成してください15 。(ヒント: まずはリスト 3.16を参考にして、/static_pages/contactというURLのページに「Contact | Ruby on Rails Tutorial Sample App」というタイトルが存在するかどうかを確認するテストを最初に作成しましょう。次に、3.3.3でAboutページを作ったときのと同じように、Contactページにもリスト 3.41のコンテンツを表示してみましょう。)

<解答>

[static_pages_controller_test.rb]

(前略)
  test "should get contact" do
    get static_pages_contact_url
    assert_response :success
    assert_select "title", "contact | #{@base_title}"
  end
end
[/sample_app/config/routes.rb]

Rails.application.routes.draw do
  get 'static_pages/home'
  get 'static_pages/help'
  get 'static_pages/about'
  get 'static_pages/contact'
  root 'application#hello'
end
[/sample_app/app/controllers/static_pages_controller.rb]

class StaticPagesController < ApplicationController
  def home
  end

  def help
  end
  
  def about
  end
  
  def contact
  end
end
$ touch app/views/static_pages/contact.html.erb
[/sample_app/app/views/static_pages/contact.html.erb]

<% provide(:title, "Contact") %>
<h1>Contact</h1>
<p>
  Contact the Ruby on Rails Tutorial about the sample app at the
  <a href="https://railstutorial.jp/contact">contact page</a>.
</p>

演習3.4.3

演習3.4.3.1

<問題>リスト 3.42にrootルーティングを追加したことで、root_urlというRailsヘルパーが使えるようになりました(以前、static_pages_home_urlが使えるようになったときと同じです)。リスト 3.43のFILL_INと記された部分を置き換えて、rootルーティングのテストを書いてみてください。

<解答>

[/sample_app/test/controllers/static_pages_controller_test.rb]

require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

  def setup
    @base_title = "Ruby on Rails Tutorial Sample App"
  end

  test "should get root" do
    get root_url
    assert_response :success
  end

(後略)

演習3.4.3.2

<問題>実はリスト 3.42のコードを書いていたので、先ほどの課題のテストは既に green になっているはずです。このような場合、テストを変更する前から成功していたのか、変更した後に成功するようになったのか、判断が難しいです。リスト 3.42のコードがテスト結果に影響を与えていることを確認するため、リスト 3.44のようにrootルーティングをコメントアウトして見て、 red になるかどうか確かめてみましょう(なおRubyのコメント機能については4.2で説明します)。最後に、コメントアウトした箇所を元に戻し(すなわちリスト 3.42に戻し)、テストが green になることを確認してみましょう。

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

演習3.4.4

演習3.4.4.1

<問題>リスト 3.42にrootルーティングを追加したことで、root_urlというRailsヘルパーが使えるようになりました(以前、static_pages_home_urlが使えるようになったときと同じです)。リスト 3.43のFILL_INと記された部分を置き換えて、rootルーティングのテストを書いてみてください。

<解答>

[/sample_app/test/controllers/static_pages_controller_test.rb]

require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
  
  def setup
    @base_title = "Ruby on Rails Tutorial Sample App"
  end
  test "should get root" do
    get root_url
    assert_response :success
    assert_select "title", "Home | #{@base_title}"
  end

(後略)

演習3.4.4.2

<問題>実はリスト 3.42のコードを書いていたので、先ほどの課題のテストは既に green になっているはずです。このような場合、テストを変更する前から成功していたのか、変更した後に成功するようになったのか、判断が難しいです。リスト 3.42のコードがテスト結果に影響を与えていることを確認するため、リスト 3.44のようにrootルーティングをコメントアウトして見て、 red になるかどうか確かめてみましょう(なおRubyのコメント機能については4.2で説明します)。最後に、コメントアウトした箇所を元に戻し(すなわちリスト 3.42に戻し)、テストが green になることを確認してみましょう。

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

コメント

タイトルとURLをコピーしました