【Railsチュートリアル】第3章 ほぼ静的なページの作成 演習と解答

## 3.1 セットアップ

### 3.1 - 1

Markdown記法のREADME（リスト 3.3）がHTMLとして正しくGitHub上で描画されているか、確認してみてください。

正しく描画されていました。

### 3.1 - 2

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

デプロイは成功していました。

## 3.2.1 静的なページの生成

### 3.2 - 1

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

```ruby:ターミナル
rails g controller Foo bar baz
```

```ruby:app/controllers/foo_controller.rb
class FooController < ApplicationController
  def bar
  end

  def baz
  end
end
```

### 3.2 - 2

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

```ruby:ターミナル
rails destroy controller Foo bar baz
```

## 3.4.2 タイトルを追加する（Green）

### 3.4.2 - 1

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

テストがGreenになるのが確認できました。

## 3.4.3 レイアウトと埋め込みRuby（Refactor）

### 3.4.3 -1

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

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

```ruby:app/controllers/static_pages_controller.rb
class StaticPagesController < ApplicationController

  # 中略

  def contact
  end
  
end
```

```ruby:test/controllers/static_pages_controller_test.rb
require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
  
  # 中略
  
  test "should get contact" do
    get static_pages_contact_url
    assert_response :success
    assert_select "title", "Contact | #{@base_title}"
  end
end
```

```ruby:app/views/static_pages/contact.html.erb
<% 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>
```

## 3.4.4 ルーティングの設定

### 3.4.4 - 1

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

```ruby:test/controllers/static_pages_controller_test.rb
require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
  
  # 中略
  
  test "should get root" do
    get root_url
    assert_response :success
    assert_select "title", "Home | #{@base_title}"
  end
  
# ここから削除
  test "should get home" do
    get static_pages_home_url
    assert_response :success
    assert_select "title", "Home | #{@base_title}"
  end
# ここまで削除

  # 後略
 
end
```

### 3.4.4 - 2

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

greenになることを確認できた。


## さいごに
* ERBを使った！
* テスト駆動開発をはじめて触った！
* リファクタリングについて学習した！

Railsのコントローラ、アクション、ビューの開発を一通り行いました。
第3章は自分の手で作っている感が今まで以上にあるのでとても楽しかったです。
次からは今回作った静的ページに色々手を加えて動的なコンテンツにしていくようなので、わくわくしますね〜！