(ギリ)20代の地方公務員がRailsチュートリアルに取り組みます【第5章】

##前提
・Railsチュートリアルは第4版
・今回の学習は3周目（9章以降は2周目）
・著者はProgate一通りやったぐらいの初学者
##基本方針
・読んだら分かることは端折る。
・意味がわからない用語は調べてまとめる（記事最下段・用語集）。
・理解できない内容を掘り下げる。
・演習はすべて取り組む。
・コードコピペは極力しない。

さて第5章。こっから本格的な開発フェーズですね。
本日の一曲はこちら。
[Luby Sparks "Pop.1979"](https://www.youtube.com/watch?v=HMUCyLOfryU)
ルビー違い。この初期衝動たっぷりのサウンドがたまらん。

[第1章](https://qiita.com/t-kawamura1/items/26729ad3969f61c4af76)で予告した通り、ProgateのSassコースやってなかったので、さくっと終わらせてきました。コードの重複を無くして記述を楽に、そして変更にも対応しやすくするための記法ですね。

　
####【5.1.1　ナビゲーション　メモと演習】
　Bootstrapが登場しました。概要は[この記事が分かりやすいかも。](https://udemy.benesse.co.jp/development/web/bootstrap-usage.html)
 要するに、あらかじめ動作が定義されたものを呼び出すことで、Web開発を楽にするためのもの。レスポンシブデザインにも難なく対応。

1.　Webページと言ったらネコ画像、というぐらいにはWebにはネコ画像が溢れていますよね。リスト 5.4のコマンドを使って、図 5.3のネコ画像をダウンロードしてきましょう8 。
→　下記コマンドでダウンロードするだけ。（猫かわいいですよね）

```
$ curl -OL cdn.learnenough.com/kitten.jpg
```

　
2.　mvコマンドを使って、ダウンロードしたkitten.jpgファイルを適切なアセットディレクトリに移動してください (参考: 5.2.1)。
→　下記コマンドでimagesディレクトリへ

```
$ mv kitten.jpg app/assets/images
```

3.　image_tagを使って、kitten.jpg画像を表示してみてください (図 5.4)。
→　下記をhomeの一番最後に追記すればOK。

```ruby:home.html.erb
<%= link_to image_tag("kitten.jpg", alt: "cute kitten") %>
```

　
####【5.1.2　BootstrapとカスタムCSS　メモと演習】
　まだまだCSSもおぼつかないので、時間がかかるけど、一つ入力するごとに動作を確認していこう。全コピしていちいちコメントアウトするよりこっちのが楽でしょ。
　そして、うっとおしいのでこの時点でネストできるもんはしていきます。たしかこの後どっかでネストしてたと思うけど。先にやっといて、あとで答え合わせと行こうか。

1.　リスト 5.10を参考にして、5.1.1.1で使ったネコ画像をコメントアウトしてみてください。また、ブラウザのHTMLインスペクタ機能を使って、コメントアウトするとHTMLのソースからも消えていることを確認してみてください。
→　指示通りやるだけ。消えろキトゥン！！！！！

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

　
####【5.1.3　パーシャル(partial)　メモと演習】
　パーシャル＝部分的な　といった意味。冷蔵庫のパーシャルをイメージすると分かりやすいかも。あそこにガシャコンと分けて収納するイメージ。他のページでも使う部分や、すべてのページで共通して使うものを、切り出して個別保存すると。必要に応じて呼び出す（render）わけか。

1.　Railsがデフォルトで生成するheadタグの部分を、リスト 5.18のようにrenderに置き換えてみてください。ヒント: 単純に削除してしまうと後でパーシャルを１から書き直す必要が出てくるので、削除する前にどこかに退避しておきましょう。
→　とりあえず適当に避難しといて指示どおり記入。

　
2.　リスト 5.18のようなパーシャルはまだ作っていないので、現時点ではテストは redになっているはずです。実際にテストを実行して確認してみましょう。
→　そらREDです。

　
3.　layoutsディレクトリにheadタグ用のパーシャルを作成し、先ほど退避しておいたコードを書き込み、最後にテストが green に戻ることを確認しましょう。
→　下記ファイルを作成してパーシャル！（テストもGREENです）

```ruby:_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' %>
```

　
####【5.2.1　アセットパイプライン　メモ】
 今一つ分かりにくいなあと思うアセットパイプライン。重要なのはこの一文か。「『開発効率と読み込み時間のどちらを重視するか』という問題について悩む必要がなくなります。開発環境ではプログラマにとって読みやすいように整理しておき、本番環境ではAsset Pipelineを使ってファイルを最小化すればよいのです。」
　要は、散らばったものを一つの細い管に通してやるイメージでしょうか。その過程でファイルを整理して無駄なものを省き、最小化してくれると。

　
####【5.2.2　素晴らしい構文を備えたスタイルシート　メモと演習】
　[LESS変数一覧](https://getbootstrap.com/docs/3.4/customize/)をみると、@gray-lightが#777じゃなくて、lighten(@gray-base, 46.7%)になってるんですが、バージョンの違いでしょうか？実際の色は変わっていないようにみえるのでいいんですが（他の既定の色も同じか）
。


1.　5.2.2で提案したように、footerのCSSを手作業で変換してみましょう。具体的には、リスト 5.17の内容を１つずつ変換していき、リスト 5.20のようにしてみてください。
→　はじめに書いたときから実践済みです。合ってました。（見やすいかと思ったのでネストに改行入れてます）

```scss: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-darker;
    }
  }
  
  small {
    float: left;
  }
  
  ul {
    float: right;
    
    li {
      float: left;
      margin-left: 15px;
    }
  }
}
```


　
####【5.3　レイアウトとリンク】
　最初、名前付きルート（〇〇_path）ってのがしっくりこなかったけど、慣習としてこう書くっていうのと、そういう機能がrailsに備わっていて、変更にも対応しやすいからこうしましょってことと理解。ルーティングを設定することで使えるようになると。

　
####【5.3.2　RailsのルートURL　メモと演習】
〇〇_path：ルートURL以下の文字列を返す。基本はこっちを使用
〇〇_url ：完全なURLの文字列を返す。リダイレクトの場合のみ使用。

1.　実は名前付きルートは、as:オプションを使って変更することができます。有名なFar Sideの漫画に倣って、Helpページの名前付きルートをhelfに変更してみてください (リスト 5.29)。
→　リスト5.29のとおりas: 'helf'を追記。

　
2.　先ほどの変更により、テストが redになっていることを確認してください。リスト 5.28を参考にルーティングを更新して、テストを greenにして見てください。
→　当然RED。テストをhelf_pathに変更するとGREENになります。

　
3.　比較演算子==を使って、上記２つの課題で作ったそれぞれのオブジェクトが同じであることを確認してみてください。
→　戻しときましょう。

　
####【5.3.3　名前付きルート　演習】
1.　リスト 5.29のようにhelfルーティングを作成し、レイアウトのリンクを更新してみてください。
2.　前回の演習と同様に、エディタのUndo機能を使ってこの演習で行った変更を元に戻してみてください。
→　helf好きやな。ルートにas: 'helf'つけて、ヘッダーのhelp_pathをhelf_pathにして終わり！そして戻す！（この演習要る？）

　
####【5.3.4　リンクのテスト　メモと演習】
　統合テスト（integration test）が登場。「統合テストを使うと、アプリケーションの動作を端から端まで (end-to-end) シミュレートしてテストすることができます。」ということです。動作の流れを考えながら書きましょう。
　テストについては、[Railsドキュメント](https://railsdoc.com/test)が分かりやすいかも？（リンク先はRails6のものです）
　assert_selectは柔軟な機能があるが、レイアウト内で頻繁に変更されるHTML要素 (リンクなど) をテストするぐらいに抑えておく方が賢明と。[第3章の用語集](https://qiita.com/t-kawamura1/items/61b1c814668bfa66471c)でも取り上げてましたね。
　おっと、ここでエラーが？調べると、リンク先を'root_path'のようにしていました。〇〇_pathはメソッドなので''は不要とのこと。単純な見落としでした。

1.　footerパーシャルのabout_pathをcontact_pathに変更してみて、テストが正しくエラーを捕まえてくれるかどうか確認してみてください。
→　/aboutにマッチする要素が一つもないよーと教えてくれます。

　
2.　リスト 5.35で示すように、Applicationヘルパーで使っているfull_titleヘルパーを、test環境でも使えるようにすると便利です。こうしておくと、リスト 5.36のようなコードを使って、正しいタイトルをテストすることができます。ただし、これは完璧なテストではありません。例えばベースタイトルに「Ruby on Rails Tutoial」といった誤字があったとしても、このテストでは発見することができないでしょう。この問題を解決するためには、full_titleヘルパーに対するテストを書く必要があります。そこで、Applicationヘルパーをテストするファイルを作成し、リスト 5.37のFILL_INの部分を適切なコードに置き換えてみてください。ヒント: リスト 5.37ではassert_equal <期待される値>, <実際の値>といった形で使っていましたが、内部では==演算子で期待される値と実際の値を比較し、正しいかどうかのテストをしています。
→　3周目でやっと内容についてこれた感があります。まずtest環境でApplicationヘルパー（のfull_titleメソッド）を使えるようにincludeする。そうすっとレイアウトの統合テストでページタイトルが合ってるかどうかテストできる。ただ誤字とかは発見できないから、Applicationヘルパー自体をテストしてやろうというわけか。FILL_INの部分は下記のとおり。テストはGREENです。

```rb:test/helpers/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.1　Usersコントローラ　演習】
1.　表 5.1を参考にしながらリスト 5.41を変更し、users_new_urlではなくsignup_pathを使えるようにしてみてください。
2.　先ほどの変更を加えたことにより、テストが redになったことを確認してください。なお、この演習はテスト駆動開発 (コラム 3.3) で説明した red/green のリズムを作ることを目的としています。このテストは次の5.4.2で greenになるよう修正します。
→　users_controller_test.rbのusers_new_urlをsignup_pathに変更するだけ。当然REDになります。
　フライングですが、signup_pathを使えるようにするにはどうするか。ルーティングを設定する必要がありますね。以下で合ってるはず。テストはGREENになりました。

```ruby:routes.rb
Rails.application.routes.draw do
  get 'users/new'

  root 'static_pages#home'
  get '/help',    to: 'static_pages#help'
  get '/about',   to: 'static_pages#about'
  get '/contact', to: 'static_pages#contact'
  get '/signup',  to: 'users#new'
end
```

　次読むと、合ってましたね。

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

　
2.　先ほどのテストが正しく動いていることを確認するため、signupルートの部分をコメントアウトし、テスト redになることを確認してください。確認できたら、コメントアウトを解除して greenの状態に戻してください。
→　試すだけー。

　
3.　リスト 5.32の統合テストにsignupページにアクセスするコードを追加してください (getメソッドを使います)。コードを追加したら実際にテストを実行し、結果が正しいことを確認してください。ヒント: リスト 5.36で紹介したfull_titleヘルパーを使ってみてください。
→　たぶんいらんけど、ついでにSing upリンクがあるか確かめるテストも追記してみました。自分の知識を確かめるために要らんこともしていきます。

```ruby: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
    assert_select "a[href=?]", signup_path
    get contact_path
    assert_select "title", full_title("Contact")
    get signup_path
    assert_select "title", full_title("Sign up")
  end
  
end
```

　
###第5章まとめ
・Bootstrapは便利やけど、使われすぎておもんないとも聞く。
・猫は万国共通でかわいい。
・Sassは便利ですね。コードがスッキリする。
・パーシャルでまとめて見た目スッキリ。
・Asset Pipelineが勝手にassets（画像とかCSSとかJSとか）を最適化してくれる。
・ルーティングを設定すると〇〇_pathと〇〇_urlが使えるようになる。
・統合テストはページ間移動とかの動作をテストできる。動作をシミュレートしよう。

　
第5章はわりとさっくり終了。3周目にして内容がやっと掴めるようになってきました。嬉しい。第6章ではユーザーモデルを作成していきます。

　
⇨　[第6章へ！](https://qiita.com/t-kawamura1/items/98aa4c06c5630c2eb798)
⇦　[第4章はこちら](https://qiita.com/t-kawamura1/items/66127dd7c23e8c1a203e)
[学習にあたっての前提・著者ステータスはこちら](https://qiita.com/t-kawamura1/items/9c955177c02871b5249c)
　
####なんとなくイメージを掴む用語集
・条件付きコメント
　Microsoft Internet Explorerに対して、コードを渡したり隠したりするのに使用できるHTMLソースコード中にある条件付きのステートメントのこと。IE10以降は廃止されている。

・レスポンシブ（ウェブ）デザイン 
　表示する端末・ブラウザによって表示形式が変わるデザインのこと。同じwebサイトでも、スマホとPCでは文字やコンテンツの大きさが変わったりするアレ。レスポンシブ対応とかよく言われるやつ。

・assert_template
　そのアクションで指定されたテンプレートが描写されているかをテスト。

・assert_equal
　assert_equal <期待される値>, <実際の値>　の形で、両者の値が等しいかテスト。