Rails Tutorialを咀嚼する【第3章 ほぼ静的なページの作成】

#3.1 セットアップ

【演習】
１．BitbucketがMarkdown記法のREADME (リスト 3.3) をHTMLとして正しく描画しているか、確認してみてください。
２．本番環境 (Heroku) のルートURLにアクセスして、デプロイが成功したかどうか確かめてみてください。

⇒そのままやってみてください。
#3.2 静的ページ
■コントローラ
コントローラとは (基本的に動的な) Webページの集合を束ねるコンテナのこと。
→ちょっと意味が分からない。

■rails generate controller StaticPages home help
コントローラーにstatic_pages_controller.rbが生成される。
routes.rbに
・static_pages/home
・static_pages/help
が生成される。

この時点でアドレスバーに「static_pages/home」と入力すれば移動する。
異動する先はビューの「home.html.erb」。
※helpも同様。

■HTTPメソッド
GET、POST、PATCH、DELETEの４つがある。
GET：ページを呼び出す
POST：ユーザーが何かを入力して送信するときに使う。
PATCH：おそらく更新に使う。
DELETE：削除に使う

【演習】
１．Fooというコントローラを生成し、その中にbarとbazアクションを追加してみてください。
→コントローラーを生成するのでrails generateを使います。
rails generate controller Foo bar baz

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

#3.3 テストから始める

■テストケース、テストスイート
1つのテストのことをテストケースと呼ぶ。
テストケースが集まったものをテストスイートと呼ぶ。

■テスト駆動設計
テストコードを書いてから開発を進める手法

■static_pages_controller_test.rb
rails gと同時に生成されている。

```ruby:test/controllers/static_pages_controller_test.rb
  test "should get home" do
    get static_pages_home_url
    assert_response :success
  end
```
このファイルは既にActionDispatch::IntegrationTestを継承しているので、
そういうものなのだと理解する。
「should get home」というテストを新しく生成。
「get static_pages_home_url」でアクセス。
「assert_response :success」で成功か否か判断。

■touch app/views/static_pages/about.html.erb
touch app/views/static_pagesのディレクトリに
about.html.erbのファイルを生成する。

右クリックからの「ファイルを作成」でもいける。

■about.html.erb
<html><body>とかはいらない。

#3.4 少しだけ動的なページ
→リファクタリングを行っているページなので、最悪後回しでも大丈夫。
■mv app/views/layouts/application.html.erb layout_file
application.html.erb を layout_fileに移動する。

■assert_select "title", "Home | Ruby on Rails Tutorial Sample App"
移動した先のページのタイトルタグの中身が「"Home | Ruby on Rails Tutorial Sample App"」かどうか確認する。

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

@base_titleにRuby on Rails Tutorial Sample Appという文字列を代入し、
それぞれで展開をしている。

■Provideメソッド
provideメソッドでパラメータを引き渡し、yieldメソッドで受け取る。
タイトルを統一させることで、<body>タグの中身以外が同じになるようにしている。

■app/views/layouts/application.html.erb
デザインの根幹をなしているもの。

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

1.static_pages/にcontact.html.erbというファイルを作る。

```ruby:routes.rb
<% 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>
```

2.テストを作る。名前をcontactに変えるだけ

```ruby: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
```

3.routesを設定する

```ruby:routes.rb
get  'static_pages/contact'
```

4.コントローラーにパスを通す。

```ruby:static_pages_controller.rb
def contact
end
```

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

rootはどこのディレクトリにも属していないのでstatc_pagesは不要

```ruby:static_pages_controller_test.rb
test "should get root" do
    get root_url
    assert_response :success
  end
```

#3.5 最後に

#3.6 高度なセットアップ