Ruby on Rails tutorialを通してのメモ (第3章その2)
前回まで
- 静的なページのセットアップ、コントローラを生成し、homeページ、helpページにアクセスできるようになりました。
- 今回はエラーコードを書きながらAboutページを作成していきます。
作業開始
@ 3.2.2 静的なページの調整
- 最初の段階で静的なHTMLが存在していることを前回確認し、修正できることもわかりました。
- リスト3.11,リスト3.12をtutolialに合わせて修正しましょう。(こちらでは省略します。)
リスト3.11: HomeページのHTMLを修正する
app/views/static_pages/home.html.erb
リスト3.12: HelpページのHTMLを修正する
app/views/static_pages/help.html.erb
- Homeページ、Helpページ共に修正されたでしょうか。ブラウザで確認してみましょう。
@ 3.3 テストから始める
- Homeページ、Helpページを作成した後、Aboutページを作成します。
- Aboutページを作成する際に自動化テストを作成し、機能が正しいかを確認します。
- テストコードはバグを追う時間が減るため開発速度アップにつながる。
実際にコマンドで確認してみる。
$ ls test/controllers/ static_pages_controller_test.rb
リスト3.13 StaticPagesコントローラのデフォルトのテスト
test/controllers/static_pages_controller_test.rb
require 'test_helper' class StaticPagesControllerTest < ActionDispatch::IntegrationTest test "should get home" do get static_pages_home_url assert_response :success end test "should get help" do get static_pages_help_url assert_response :success end end
- test do ~ end で囲まれたテストが二つ描かれている。
- この二つのテストは、HomeとHelpのアクションに対応として生成されている。
- テストの内容はまず、"get ~ _url" と書いてあり、それぞれアクションをGETした後正常化を確認する。この"get"とは、HomeページやHelpページが「getリクエストを受け付ける」Webページであることを示す。
- この確認は「アサーション」と呼ばれる手法で行う。
- テスト内容の二つ目に、"assert_responce:success"と書いてある。リクエストはsuccessだ。と書いてある。
- テスト内容は「Homeページのテスト。GETリクエストをhomeアクションに対して発行せよ。その後リクエストに対するレスポンスはsuccessのはず。」という内容。(tutolialそのままだが、、)
- 現在のテストスイートを確認してみる。リンクを張ったがテストスイートとは複数のテストケースをまとめたものだそうだ。
リスト3.14:GREEN
$ rails test
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
- どうやらfailures,errorsあたりが0なので正常みたいです。
- $ rails test を実行してみましたが、実行にはある程度の時間がかかるようです。その理由が↓の二つのようです。
@ 3.3.2 Red
- テスト駆動開発のサイクルは、
- 失敗するテストを最初に書く
- アプリケーションコードを書いて成功させいる。
- 必要ならリファクタリング(修正)する。
- テストの成功はGREEN,失敗をRED,リファクタリングはREFACTORとする。またこの三つをサイクルと呼ぶことがある。
- ここで、サイクルの一つ目としてAboutページ用の失敗するテストを書く。
- サイクルの最初としてAboutページ用の失敗するテストを書く。
- HomeやHelpのテストコードに習ってAboutページのテストコードを書いてみる。
リスト3.15: Aboutページのテスト RED
test/controllers/static_pages_controller_test.rb
test "should get about" do get static_pages_about_url assert_response :success end
- このまま実行すると、期待としては、Aboutに対応するアクションが存在しないためエラーが出るはずです。つまり↓のように失敗したら期待通りです。
リスト3.16:RED
$ rails test
3 tests, 2 assertions, 0 failures, 1 errors, 0 skips
- テストが失敗したので、次の段階としては、テストのエラーメッセージを頼りにテストをGREENにさせるようなコードを書き、Aboutページを実装します。
- エラーメッセージの確認をします。
リスト3.17:RED
$ rails test
NameError: undefined local variable or method `static_pages_about_url'
- 同じ内容のエラーメッセージが見つかったでしょうか?
- エラーメッセージを読んでみると「undefinded ,'static_pages_about_url'」なので 「AboutページのURLが見つからない」と言われているようです。
- まずはHomeやHelpページを作成した際に行ったように、ルーティングを修正します。
リスト3.18: about用のルートの追加をする。
config/routes.rb
get 'static_pages/about'
- homeやhelpのルーティングを真似てaboutのルートを追加すればできるはず。
- GETリクエストが来た時、StaticPageコントローラのaboutアクションに渡す処理をRailsが指示する。結果static_pages_about_urlというヘルパーが使えるようになる。 ヘルパーとは、今回のようにstatic_pages_about_urlをメソッドとして使えるようにすることでわざわざURLを指定しなくても良くなるといいたRailsの機能のことをいう。
- ルーティングを編集しただけなので、コントローラを修正しなければまだREDのままのはずです。そのためもう一度テストスイートを実行してみる。
リスト3.19:RED
$ rails test AbstractController::ActionNotFound: The action 'about' could not be found for StaticPagesController
- 同じようなエラーメッセージが出たでしょうか。前回はURLについてのエラーでしたが、今回はControllerについてエラーが出ていることが確認できるはずです。
- そのためコントローラにaboutアクションを追加しましょう。
リスト3.20: aboutアクションが追加されたStaticPagesコントローラRED
app/controllers/static_pages_controller.rb
def about end
- home,helpアクションに習ってaboutアクションを追加できたでしょうか。
- それではテストをしてみましょう。
$ rails test ActionController::UnknownFormat: StaticPagesController#about is missing a template for this request format and variant.
- 今更ですが、$ rails test は $ rails t と省略して実行できます。何回も打っていて楽に実行したいと思った方はすでにそうしていたでしょうか。
- エラー内容は、"missing template"と書いてあります。このエラーは、viewファイルがファイル名が間違っている時や存在しない時によく見かけるエラーです。今回はviewファイルが未作成なので作成しましょう。
- app/views/static_pagesディレクトリにabout.html.erbファイルを作りましょう。テキストエディタやFinder,tutolialではコマンドで作っています。私はテキストエディタなのでコマンドでは作成しませんが。😆
- テキストファイルabout.erbを作成したら、内容をリスト3.21の内容に修正します。ここでは省略します。
リスト3.21: Aboutページのコード
app/views_static_pages/about.html.erb
- 次こそはエラーが出なくなっているはずです。
リスト3.22:GREEN
$ rails test 3 tests, 3 assertions, 0 failures, 0 errors, 0 skips
- 私もエラーが出なかったです。おお!と少し驚きました。エラーが解消されると嬉しいですね。🤗
- ブラウザでも確認してみましょう。URLは/static_pages_aboutです。 $ rails s でサーバを起動させて確認してみましょう。
@ 3.3.4 Refactor
- Refactorに関しては3.4.3から始めるそうです。
to be continued...
まずは一つの教材を2,3週することから始めていきたいです。アプリを作るためにはまず一つを理解して作り上げなければなりません。と思います。不思議なことに、調べれば調べるほどあれやこれやと良さげな本やサイトが出てくるのであれもやらなきゃと焦ってしまうのですが、鈍感さも大事みたいです。
次回は動的ページに挑戦です。
オススメの曲
ZeddのRemixがかなりうまくハマっている。革命や。