🌷

Rails チュートリアル 3章

に公開

まえがき

Railsチュートリアル3章において押さえておいた方がいいポイント、各ファイルの役割まとめを行うなどすることで、3章の学習内容を俯瞰し整理することを目的とする。


静的なページ作成(sample_app)において変更を加えたファイル

追加

  1. home.html.erb(自動)
    homeページのビューの構造を記述したファイル。generateによってデフォルトが追加されている。ただ、内容に関しては、望む内容に合わせて変更を行う。
  2. help.html.erb(自動)
    同上。helpページのビュー構造指定ファイルである。
  3. about.html.erb(手動)
    aboutページのビューの構造を記述したファイル。今回、aboutページは手動追加しているため、こちらも自身で追加し、内容を整える必要がある。
  4. contact.html.erb(手動)
    同上。contactページのビュー構造指定ファイルである。
  5. static_pages_controller_test.rb
    テストの内容を記述したファイル。これもgenerateを実行すれば自動で追加されるファイルである。デフォルト状態では、アクションに対してリクエストを飛ばした際、それが成功するかどうかを確かめるテストが含まれている(get,assert_response)。別のテストであったり、generateで追加していないアクションに対しては、自身で同じようにテストコードを記述すると良い。

追記・変更

  1. static_pages_controller.rb
    各Webページを管理するコントローラであり、このファイルの中に各ページの関数が用意されている。rails generateでアクション名を指定して生成する場合、手動による追記は不要であるが、1から自身でページ追加を行う際には、アクションを定義しておく必要がある。

  2. routes.rb
    1と同様、コマンドを用いている場合は、特に変更の必要はないが、自身で追加を行う際には手動で追記する必要がある。URLとアクションを結びつけるためにコードを記述する。また、ここでルート「/」とWebページの結び付けも行うので必要ならば記述する。今回は、ルートをhomeとしたかったため、rootとしてコントローラ(static_pages)とアクション(home)を#区切りで指定してある。


手動でアクションを追加する際の手順

  1. テストファイルにテスト内容を記述する
    新たに作成するアクション名を使って、あらかじめgenerateで作成されたテスト(home,helpのもの)と同様のテストを記述する。
  2. コントローラファイルに新たに作成するアクション名で関数を定義する
    継承しているクラスを用いることで、すでにRails特有の振る舞いをできることから、今回は特に中身がなくても良い。(他のアクションと同様)
  3. ルーティングファイルにgetコマンドを追加する
    URLとコントローラのアクションを結びつけるルーティングを行う。
  4. ビューとしてHTMLファイルを作成する
    新しくファイルを追加することになる。記述内容は自由だが、リファクタリングによって記述する内容が簡略化されているなら、すでにリファクタリングされた別ページのファイル(home.html.erbなど)の形式を参考に自由に記述する。

テストについて

コーディングにおいて、テストは、こまめに自動化テスト(テストスイート)を実施することにより、今後のバクの発生を防止し、コードをより安全にリファクタリングを行うのに役立つなど重要な段階である。テストを作成する段階については、アクションよりテストコードの方が短くなりそうな場合、セキュリティインシデントが発生した場合、リファクタリングする場合などではアクションなどの記述に先駆けて行うが、すぐまた変更しそうな、コードに対するテストは後でいいということが知られている。
本章ではコントローラテストを行う。また、Railsにおけるテストの実施は以下のコードで行う。(ただし、同ディレクトリ内部にテストファイルが含まれていることを前提とする。)

bash
$ rails t(testでも可)

テストの追記

3章ではgenerateコマンドにより自動で追加されたテスト以外に、テストを追記する。内容は、各ページのHTMLのタイトルタグ内部を対象としたテストである。特定タグに対し、特定文字列が含まれているかどうかを判定するには以下のコードをテストファイルに加えれば良い。

static_pages_controller_test.rb
assert_select "tag_name", "string"

リファクタリングの工夫

DRY(Don't Repeat Yourself)の理念に反する部分を機能が変わらないように簡略化する!

  • インスタンス変数@とその展開などを用いて、同じ文字列の繰り返し入力を避ける
    ex)テストページにおける同一タイトルの繰り返しを解消
  • ERB(埋め込みRuby)のprovideメソッドを用いることで、指定の位置でレイアウトを呼び出す
    ex)ビューのHTMLファイルのlayoutのapplication.html.erbでHTML構造を1度記述するだけで、他のビューのHTMLファイルでは異なる部分のみ(bodyタグの中身)のみを入力すればいい状態にした

テスト実行における工夫

以下のようなGem(ライブラリ)やコマンドラインツールを用いることでテストがより快適になる

  • minitest reporters
    テスト実行結果において、成功なら緑、失敗なら赤と色をつけてくれることで一目で結果がわかるようにしてくれるGemである。
  • Guard
    ファイルが変更されたときは、テストファイルを自動実行してくれる機能を持つコマンドラインツールであり、生成されるGuardfileを編集することでカスタマイズを行う。以下のコマンドを打ち込んでファイルに変更を行えば、自動でテストを実行してくれる。
    bash
    $ bundle exec guard
    

Discussion