Railsチュートリアル第５章

引き続きRailsチュートリアルを進めています。
演習の回答をまとめていますが、間違いやより良い書き方などあればコメントいただけると嬉しいです。

#5.1　構造を追加する
##5.1.1　ナビゲーション
###演習１
Webページと言ったらネコ画像、というぐらいにはWebにはネコ画像が溢れていますよね。リスト 5.4のコマンドを使って、図 5.3のネコ画像をダウンロードしてきましょう8。

```
$ curl -OL cdn.learnenough.com/kitten.jpg
```
###演習2
mvコマンドを使って、ダウンロードしたkitten.jpgファイルを適切なアセットディレクトリに移動してください (参考: 5.2.1)。

```
 $ mv kitten.jpg app/assets/images
```
###演習3
image_tagを使って、kitten.jpg画像を表示してみてください (図 5.4)。

```static_pages/home.html.erb
<%= image_tag("kitten.jpg") %>
```
##5.1.2　BootstrapとカスタムCSS
###演習1
リスト 5.10を参考にして、5.1.1.1で使ったネコ画像をコメントアウトしてみてください。また、ブラウザのHTMLインスペクタ機能を使って、コメントアウトするとHTMLのソースからも消えていることを確認してみてください。

（確認だけなので省略）
###演習2
リスト 5.11のコードをcustom.scssに追加し、すべての画像を非表示にしてみてください。うまくいけば、Railsのロゴ画像がHomeページから消えるはずです。先ほどと同様にインスペクタ機能を使って、今度はHTMLのソースコードは残ったままで、画像だけが表示されなくなっていることを確認してみてください。

（確認だけなので省略）
##5.1.3　パーシャル（partial）
###演習1
Railsがデフォルトで生成するheadタグの部分を、リスト 5.18のようにrenderに置き換えてみてください。ヒント: 単純に削除してしまうと後でパーシャルを１から書き直す必要が出てくるので、削除する前にどこかに退避しておきましょう。

```/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= render 'layouts/rails_default' %>
    <%= render 'layouts/shim' %>
  </head>
.
.
```
###演習2
リスト 5.18のようなパーシャルはまだ作っていないので、現時点ではテストは redになっているはずです。実際にテストを実行して確認してみましょう。

（REDになりました）

###演習3
layoutsディレクトリにheadタグ用のパーシャルを作成し、先ほど退避しておいたコードを書き込み、最後にテストが green に戻ることを確認しましょう。

```layouts/_rails_default.html.erb
<%= csrf_meta_tags %>
<%= stylesheet_link_tag    'application', media: 'all',
                           'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application',
                           'data-turbolinks-track': 'reload' %>
```
（GREENになりました）
##5.2　Sassとアセットパイプライン
##5.2.2　素晴らしい構文を備えたスタイルシート
###演習1
5.2.2で提案したように、footerのCSSを手作業で変換してみましょう。具体的には、リスト 5.17の内容を１つずつ変換していき、リスト 5.20のようにしてみてください。

```custom.scss
.
.

/* footer */

footer {
  margin-top: 45px;
  padding-top: 5px;
  border-top: 1px solid $gray-medium-light;
  color: $gray-light;
  a {
  color: $gray;
  &:hover {
    color: $gray-light;
    }
  }
  small {
  float: left;
  }
  ul {
  float: right;
  list-style: none;
  li {
    float: left;
    margin-left: 15px;
    }
  }
}
```
#5.3　レイアウトのリンク
##5.3.1　Contactページ
###演習１
実は名前付きルートは、as:オプションを使って変更することができます。有名なFar Sideの漫画に倣って、Helpページの名前付きルートをhelfに変更してみてください (リスト 5.29)。

```routes.rb
Rails.application.routes.draw do
  root 'static_pages#home'
  get  '/help',     to: 'static_pages#help', as: 'helf'
  get  '/about',    to: 'static_pages#about'
  get  '/contact',  to: 'static_pages#contact'
end
```
###演習２
先ほどの変更により、テストが redになっていることを確認してください。リスト 5.28を参考にルーティングを更新して、テストを greenにして見てください。

```static_pages_controller_test.rb
.
.
  test "should get helf" do
    get help_path
    assert_response :success
    assert_select "title", "Help | #{@base_title}"
  end
.
.
```
###演習３
エディタのUndo機能を使って、今回の演習で行った変更を元に戻して見てください。

（command + z で戻しました）

##5.3.3　名前付きルート
###演習1
リスト 5.29のようにhelfルーティングを作成し、レイアウトのリンクを更新してみてください。

```routes.rb
Rails.application.routes.draw do
  root 'static_pages#home'
  get  '/help',     to: 'static_pages#help', as: 'helf'
  get  '/about',    to: 'static_pages#about'
  get  '/contact',  to: 'static_pages#contact'
end

```
```_header.html.erb
<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="container">
    <%= link_to "sample app", root_path, id: "logo" %>
    <nav>
      <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "Home", root_path %></li>
        <li><%= link_to "Help", helf_path %></li>
        <li><%= link_to "Log in", '#' %></li>
      </ul>
    </nav>
  </div>
</header>
```

###演習2
前回の演習と同様に、エディタのUndo機能を使ってこの演習で行った変更を元に戻してみてください。

（command + z で戻しました）

##5.3.4　リンクのテスト
###演習１
footerパーシャルのabout_pathをcontact_pathに変更してみて、テストが正しくエラーを捕まえてくれるかどうか確認してみてください。

（正しくエラーを捕まえてくれました）

###演習２
リスト 5.35で示すように、Applicationヘルパーで使っているfull_titleヘルパーを、test環境でも使えるようにすると便利です。こうしておくと、リスト 5.36のようなコードを使って、正しいタイトルをテストすることができます。ただし、これは完璧なテストではありません。例えばベースタイトルに「Ruby on Rails Tutoial」といった誤字があったとしても、このテストでは発見することができないでしょう。この問題を解決するためには、full_titleヘルパーに対するテストを書く必要があります。そこで、Applicationヘルパーをテストするファイルを作成し、リスト 5.37のFILL_INの部分を適切なコードに置き換えてみてください。ヒント: リスト 5.37ではassert_equal <期待される値>, <実際の値>といった形で使っていましたが、内部では==演算子で期待される値と実際の値を比較し、正しいかどうかのテストをしています。

```application_helper_test.rb
require 'test_helper'

class ApplicationHelperTest < ActionView::TestCase
  test "full title helper" do
    assert_equal full_title,         "Ruby on Rails Tutorial Sample App"
    assert_equal full_title("Help"), "Help | Ruby on Rails Tutorial Sample App"
  end
end
```

#5.4　ユーザー登録：最初のステップ
##5.4.1　Usersコントローラ
###演習１
表 5.1を参考にしながらリスト 5.41を変更し、users_new_urlではなくsignup_pathを使えるようにしてみてください。

```users_controller_test.rb
require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
  test "should get new" do
    get signup_path
    assert_response :success
  end

end
```
###演習２
先ほどの変更を加えたことにより、テストが redになったことを確認してください。なお、この演習はテスト駆動開発 (コラム 3.3) で説明した red/green のリズムを作ることを目的としています。このテストは次の5.4.2で greenになるよう修正します。

（REDになりました）
##5.4.2  ユーザー登録用URL
###演習１
もしまだ5.4.1.1の演習に取り掛かっていなければ、まずはリスト 5.41のように変更し、名前付きルートsignup_pathを使えるようにしてください。また、リスト 5.43で名前付きルートが使えるようになったので、現時点でテストが greenになっていることを確認してください。

（GREENになりました）
###演習２
先ほどのテストが正しく動いていることを確認するため、signupルートの部分をコメントアウトし、テスト redになることを確認してください。確認できたら、コメントアウトを解除して greenの状態に戻してください。

（REDになることを確認できました）
###演習３
リスト 5.32の統合テストにsignupページにアクセスするコードを追加してください (getメソッドを使います)。コードを追加したら実際にテストを実行し、結果が正しいことを確認してください。ヒント: リスト 5.36で紹介したfull_titleヘルパーを使ってみてください。

```site_layout_test.rb
require 'test_helper'

class SiteLayoutTest < ActionDispatch::IntegrationTest

 test "layout links" do
   get root_path
   assert_template 'static_pages/home'
   assert_select "a[href=?]", root_path, count: 2
   assert_select "a[href=?]", help_path
   assert_select "a[href=?]", about_path
   assert_select "a[href=?]", contact_path
   get contact_path
   assert_select "title", full_title("Contact")
   get signup_path
   assert_select "title", full_title("Sign up")
 end
end
```