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

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


第3章 ほぼ静的なページの作成 - Railsチュートリアル

f:id:yukitoku_sw:20191019165508p:plain

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


演習3.1

問題1

BitbucketがMarkdown記法のREADME (リスト 3.3) をHTMLとして正しく描画しているか、確認してみてください。

解答

f:id:yukitoku_sw:20191020084033p:plain


問題2

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

解答

$ heroku open

コンソールに上記コマンドを入力する。 "ほにゃらら.herokuapp.com"というページが表示され、bodyに"hello, world!"と表示されている。


演習3.2.1

問題1

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

解答

$ rails g controller Foo bar baz

上記コマンドで下記ファイルが生成される

[config/routes.rb]

Rails.application.routes.draw do
  get 'foo/bar'
  get 'foo/baz'
(中略)
end
[app/controllers/foo_controller.rb]

class FooController < ApplicationController
  def bar
  end

  def baz
  end
end


問題2

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

解答

$ rails d controller Foo bar baz


演習3.4.2

問題1

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

解答

リスト3.30参照


演習3.4.3

問題1

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

解答

テストを作成する

[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 contact" do
    get static_pages_contact_url
    assert_response :success
    assert_select "title", "Contact | #{@base_title}"
  end
end

テストを実行するとNameError と出るので、ルーティングファイルを修正する

[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

テストを実行するとAbstractController::ActionNotFound: と出るので、コントローラファイルを修正する

[app/controllers/static_pages_controller.rb]

class StaticPagesController < ApplicationController
  def home
  end

  def help
  end

  def about
  end

  def contact       # contactを追加
  end
end

テストを実行するとActionController::UnknownFormat と出るので、ビューファイルを作成する

[コンソール]
$ touch app/views/static_pages/contact.html.erb

コードはリスト3.40を参照

テストが全て通るようになります。


演習3.4.4

問題1

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

解答

[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

(中略)
end


問題2

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

解答

リスト3.43参照


おわりだ!


yukitoku-sw.hatenablog.com