Ruby on Railsチュートリアル第6版 第3章まとめ

Ruby on Railsチュートリアル第6版の第3章のまとめです。

個人的に気になったところ、難しかったところ、わからなかったところを中心にまとめていきます。基本的に自分の理解を助けることと、復習しやすくすることを目的とした記事ですが、今Ruby on Railsチュートリアルをやってる人に役立つ情報があるかもしれません。

僕の学習の順番は、1周目はRailsチュートリアル第4版(Rails5.1)を使い、2周目で第6版を使うという感じになってます。これは1周目が終わったところで第6版のWebテキスト版がリリースされたからです。

ちなみに、2周目は解説動画を購入してやってます。オススメです。

第3章 ほぼ静的なページの作成

第3章から最終章の第14章までを使って、1つのアプリケーションを作っていきます。第1章、第2章で1つずつだったので驚きな感じですが、やってみると納得します。

3.1 セットアップ

まずは第1章、第2章と同じようにRailsアプリケーションを生成するところからです。3回目なので指示通りにやってけば問題ないと思います。

今回もGemfileを書き換えるんですが、bundle installでエラーが出たら、これまでと同じようにbundle updateを実行します。

ちょっと余裕が出てきたので、bundle installとbundle updateの違いを見てみようと思います。解説動画での説明を見て、その違いを勘違いしてたことに気づきました。

36時間以上の解説動画でオンライン学習 - Railsチュートリアル
図やイラストを使ってコーディングしながら解説する36時間の動画です。早く効率的に学びたい、動画を観ながら勉強したい、といった場面でお役立てください。

僕が勝手にイメージしてたのは、bundle installはgemをインストールすることで、bundle updateはインストールするgemをアップデートする(指定したものを揃える)というものでした。

でも、違ったんです。「bundle install と bundle updateの違いについて」という記事から引用しつつ、見ていきます。

bundle installを実行すると、railsは、gemfile.lockを元にgemのインストールを行います。この時、gemfile.lockに記述されていない、且つgemfileに記述されているgemがある場合、そのgemとそのgemに関連するgemをインストール後、gemfile.lockを更新します。

bundle install と bundle updateの違いについて

これがbundle installです。「gemfile.lockを元に」というのが重要です。

一方のbundle updateはというと、こんな感じです。

bundle updateを実行すると、Bundlerは、gemfileを元にgemのインストールを行います。その後、gemfile.lockを更新します。

bundle install と bundle updateの違いについて

こちらは「gemfileを元に」ですね。ここが大きな違いになります。

この違いがどういうことを意味するんでしょうか。僕はここからは読み取れませんでした。でも、ありがたいことに、上で引用した記事の中に2つのコマンドの使い分けについて書かれてました。

bundle updateは文字通り、gemのバージョンを更新する時に使用します。これは、bundle installコマンドはgemfile.lockにあるgemについては、更新しないためです。

bundle install と bundle updateの違いについて

これでようやく意味がわかりました。

bundle installは、gemfile.lockにあるgemを更新してくれないので、gemfileを書き換えたときにすでにgemfile.lockにあるgemでエラーが出てるということなのでしょう。

つまり、gemfile.lockにAというgemのバージョン1.0.0があるとします。gemfileでAのバージョンを1.2.0にしてbundle installするとバーション1.2.0はインストールされないということです。

これは試してないので、本当にそうなのかわかりません。そのうち試してみようかなと思います。

一方、bundle updateはgemのバージョンも更新してくれます。というより、gemfileに書かれた内容でgemをインストールして、gemfile.lockを更新してくれます。

なので、bundle updateをすると、Aというgemのバージョン1.2.0がインストールされるということのようです。

bundle updateのあとにbundle installをやってましたが、意味がなかったということですね。。。

bundle installとbundle updateの違いについてはこの辺にして、先に進みます。

次はこれまでのように、Gitでのバージョン管理、GitHubへのプッシュ、Herokuへのデプロイなど、指示通りにやっていきます。ここは問題なく進めると思います。

3.2 静的ページ

ここまででアプリケーション開発の準備ができたので、Gitでブランチを作って作業を進めていきます。

3.2.1 静的なページの生成

第2章ではscaffoldを使いましたが、第3章以降ではscaffoldを使わずに開発してきます。

rails generate controller

このコマンドを使ってコントローラを作ります。アクション名も同時に指定します。そうすると、いろんなファイルが作成されます。

Railsチュートリアルの書かれてる通りに、内容を確認していきましょう。演習ではコントローラの削除も体験できるので、演習をやらない選択をした人も、ここだけはやっておくといいかなと思います。

3.2.2 静的なページの調整

上で作ったページを書き換えます。HTMLに慣れてない人は、実際にコードを打った方が勉強になると思います。

僕は1周目はURL以外を手打ちしました。2周目は面倒だったのでコピペです。プログラミング学習の最初の方で模写コーディングをやったのが役立った感じですね。

3.3 テストから始める

3.3 テストから始める

Web系プログラミングを調べてると、「テストが~」という情報が出てきます。よくわかんないなと思ってたテストがここから出てきます。

このテストに関しては、わからないままでも、言われた通りにやってくと、Railsチュートリアルが終わる頃には何となくわかるようになると思います。

3.3.1 最初のテスト

いきなりテストを書くのかと思ったら、実はコントローラを作ったときにテストも同時に作ってくれてます。

この時点ではこれだけでも難しく感じるかもしれませんが、2周目の感想としては「簡単なテストだったんだな」という感じです。

rails test

これがテストのコマンドです。これから何度も使うことになります。

3.3.2 Red

いきなりREDと言われても困りますが、REDはテストが通らなかったことを意味します。何かしらのエラーがあるということです。

テストをパスしたときは、GREENと表現します。

ここではテスト駆動開発で進めていきます。Wikipediaにはテスト駆動開発について次のように書いてあります。

テスト駆動開発(test-driven development; TDD)とは、プログラム開発手法の一種で、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。

テスト駆動開発-Wikipedia

ということで、テストを先に書いて、テストが失敗すること(REDになること)を確認してから実装してきます。

3.3.3 Green

テストを書いたので、そのテストがGREENになるようにコードを書いていきます。REDになってる原因はいくつかありますが、それを1つずつ解決していきます。

これからテストで何度もREDに出会うので、ここは丁寧に理解してく方がいいと思います。指示通りに進めてるのにREDになるみたいなことになったときに、自力で解決する必要があるからです。

ちなみに、1周目で指示通りに進めてるのにREDになった原因はスペルミスだったり、直し忘れだったりが多かったと思います。1行ずつコピペでどこが間違ってるか確認したこともありました。

3.3.4 Refactor

ここはリファクタリングの説明です。次から実際にリファクタリングをやることになります。

3.4 少しだけ動的なページ

ここまでで3つのページが出来上がってると思います。でも、同じような記述があるので、これをまとめたいというのがここでやりたいことです。

3.4.1 タイトルをテストする(Red)

ページによってタイトルを変えるというのは大事な機能(?)ですよね。このブログも記事によってタイトルが違います。「記事名 | ブログ名」という構成にしてあります。

この記事であれば、「Ruby on Railsチュートリアル第6版 第3章まとめ | 心理職の独り言」になってます。

Railsチュートリアルでも同じような感じにしてくようです。まずはテストから書きます。

テストを追加したので、当然REDになります。

3.4.2 タイトルを追加する(Green)

ここでテストがGREENになるようにタイトルを書き換えます。これを3つのページすべてでやると、テストがGREENになります。

演習では、タイトルの共通部分を変数にまとめる作業をやります。これもリファクタリングということなのかなと思います。

3.4.3 レイアウトと埋め込みRuby(Refactor)

ここまでで狙ったように実装ができたので、リファクタリングに入ります。無駄を削減しようという感じです。

RubyにはDRY原則というものがあり、それに沿ったもののようです。

DRYは(Don’t Repeat Yourself)の略で、同じことを繰り返さないようにするということです。同じコードがあれば1つにまとめるとか、そういう感じです。

ここでは、「provide」と「yield」が出てきます。

provideについては公式っぽい情報が見つけられませんでしたが、実際の動きと単語の意味から理解することができます。

provideは「提供する」という意味で、Railsチュートリアル第3章では、次のように使ってます。

<% provide(:title, "Home") %>

単語の意味から理解すると「:titleにHomeを提供する」みたいな感じですね。わかりやすく言うと、「:titleの中にHomeを入れる」というところですかね。

続いてyieldです。yieldは「産出する」とか、「生み出す」とか、「もたらす」という意味です。

Railsガイドには次のように書かれてます。

yieldメソッドは、レイアウトのコンテキストでビューを挿入すべき場所を指定するのに使用します。yieldの最も単純な使用法は、yieldを1つだけ使用して、現在レンダリングされているビューのコンテンツ全体をその場所に挿入するというものです。

3.2 yieldを理解する-Railsガイドv6.0

yieldメソッドは「ここに挿入してね」という使い方のようです。Railsチュートリアル第3章の3.4.3(今説明してるところ)では、「provideに書いたものをここに挿入してね」という感じで使われてると思います。

実際にコードは次のようになってます。

<title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>

ここではyieldの引数(たぶんそのはず)が「:title」になってます。「:title」にはprovideのところで「Home」を入れてるので、

<%= yield(:title) %>

のところには「Home」が挿入されることになります。「:title」を「:hoge」にしても機能したので、「:title」じゃなくてもいいようです。タイトルだからわかりやすいように「:title」を使ってるということだと思います。

指示通りに進めると、ビューがすごくシンプルなものになります。逆に言えば、1つのファイルだけで実際に表示される内容がわからないので、それぞれのファイルがどのような関係になってるかを理解しておく必要があるということだと思います。

テストがGREENのままリファクタリングができたら完成です。

3.4.4 ルーティングの設定

指示通りに、ルート「/」で表示するページを変えます。ここは簡単に終わると思います。

3.5 最後に

コミット、masterブランチへのマージをして、GitHubにプッシュ、Herokuにデプロイして、第3章での開発は終わりです。

第4章に進む前に次の「高度なセットアップ」をやっておくと、テストが見やすくなります。

3.6 高度なセットアップ

3.6.1ではテストのREDGREENに色をつける、3.6.2ではテストを自動化するための設定をします。

テスト結果に色がつくと見やすくなるので必ずやっておきましょう。むしろ、テストを導入する前にやっておいてもいいんじゃないかなと思うくらいです。

テストの自動化は使うタイミングがわからなかったこともあり、存在を忘れてました。2周目で「そういえば、こんなのもあったな」と思いだしたくらいです。

まとめ

第3章ではほぼ静的なページを作りました。タイトルをページによって変更するという少し動的なところもありますが、まだまだRuby on Railsを使うメリットを感じられないかもしれません。

この章で一番大事なのはテストじゃないかなと思います。最初は「面倒なことをなんでやるんだろう?」と思いましたが、Railsチュートリアルをやりきる頃にはテストがないと「これで大丈夫かな?」と思うようになりました。

GitHubとかHerokuとかもやったのであれば、2周目は第3章からでもいいかもしれません。

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう
SNS 開発を題材にした大型チュートリアル。プロダクト開発の 0→1 を創りながら学びます。電子書籍や解説動画、質問対応、法人向けサービスも提供しています。