Ruby on Railsチュートリアルの演習問題と解答をまとめる。
第3章 ほぼ静的なページの作成 - Railsチュートリアル
アウトプットすることで、より自分の理解を深めることを目的としています。
自分なりに調べて考えた回答のため、記載内容に誤りがある場合はコメントいただけると幸いです。
演習3.1
問題1
BitbucketがMarkdown記法のREADME (リスト 3.3) をHTMLとして正しく描画しているか、確認してみてください。
解答
問題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参照
おわりだ!