Ruby on Railsチュートリアル第6版の第2章のまとめです。
個人的に気になったところ、難しかったところ、わからなかったところを中心にまとめていきます。基本的に自分の理解を助けることと、復習しやすくすることを目的とした記事ですが、今Ruby on Railsチュートリアルをやってる人に役立つ情報があるかもしれません。
僕の学習の順番は、1周目はRailsチュートリアル第4版(Rails5.1)を使い、2周目で第6版を使うという感じになってます。これは1周目が終わったところで第6版のWebテキスト版がリリースされたからです。
ちなみに、2周目は解説動画を購入してやってます。オススメです。
第2章 Toyアプリケーション
Ruby on Railsチュートリアルの第2章では、ユーザー登録や投稿ができるRailsアプリケーションを作ります。ものすごく簡単にできてしまうので、初めての人は驚くと思います。
似たようなものはProgateでもやるので、Progateを経由してきた人は「あれかな?」と思うかもしれませんね。
あの感動をもう一度。
2.1 アプリケーションの計画
第1章と同じように、Railsアプリケーションを作るところから始めます。今回もバージョンは6.0.0です。
Gemfileを指示通りに書き換えて、bundle installします。「–without production」を忘れずに。1周目でこれをつけ忘れて、エラーが出て何分か悩みました。
コマンドを正確に入れてもエラーが出ることがあります。エラーメッセージにもbundle updateするように書かれてます。
Bundler could not find compatible versions for gem "activesupport":
In snapshot (Gemfile.lock):
activesupport (= 6.0.2.2)
In Gemfile:
rails (= 6.0.0) was resolved to 6.0.0, which depends on
activesupport (= 6.0.0)
sass-rails (= 5.1.0) was resolved to 5.1.0, which depends on
railties (>= 5.2.0) was resolved to 6.0.2.2, which depends on
activesupport (= 6.0.2.2)
Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
これも第1章と同じように、bundle updateで対応します。
Bundle complete! 17 Gemfile dependencies, 75 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
ちなみに、ここに書いたエラーメッセージは第1章でのものです。第2章でのものは保存を忘れました。なので、細かいところは違うかもしれませんが、基本的にやることは変わりません。
これが終わったら、Gitのバージョン管理下に置きます。そして、いきなりHerokuへのデプロイに進みます。
ルートで表示されるページを変更したりして、git commitして、GitHubとHerokuにプッシュします。
Herokuの方でどうだったか確認を忘れましたが、この時点では開発環境ではページが表示されません。これは第1章で出てきたエラーと同じです。
2.1.1 ユーザーのモデル設計と 2.1.2 マイクロポストのモデル設計
Railsアプリケーションではデータベースが使われるわけですが、モデルはデータベースとのやりとりをするものみたいです。
モデルとはアプリケーションが扱うデータや処理を表現する仕組みのこと
Railsドキュメント
モデル設計はデータベースをどういう構成にするかということと関係してるようです。
2.2 Usersリソース
scaffoldを使ってUserモデルを作ります。
Railsドキュメントによると、モデル名は先頭が大文字の単数形という命名規則になってるそうです。モデルを作ると他のファイルもできるんですが、それらも命名規則があります。
モデル名:先頭は大文字で単数形(例:User)
Railsドキュメント
モデルのファイル名:先頭は小文字で単数形(例:user.rb)
テーブル名:先頭は小文字で複数形(例:users)
テストスクリプト名:xxx_test.rb(例:user_text.rb)
rails generate scaffoldを実行すると、いろんなファイルが作られます。そのあと、マイグレート(migrate)することでデータベースが作られます。
migrateは移行するとか、移動するとか、移住するという意味みたいです。
このあと、第1章でもやったCloud9への接続を許可するコードを追加して、開発環境でページが表示できるようになります。
2.2.1 ユーザーページを探検する
Railsチュートリアルの指示通りでもいいですし、自分の好きなようにでもいいので、アプリケーションをいろいろ触ってみます。こんなに簡単に、ここまでのものができるなんて感動的です。
Ruby on Railsはなんてすばらしいんだろうと思いましたが、第3章以降ではscaffoldは使いません。実際の現場で使われるかという疑問については、解説動画に回答があります。

2.2.2 MVCの挙動
第1章でもチラッと出てきたMVC(Model-View-Controller)。ここでは詳しく説明されてます。
1周目の途中からモデルとコントローラがぐちゃぐちゃになって、大混乱したので、ここで整理したいと思います。
モデルは上でも書いたように、「データや処理を表現する仕組み」のことで、データベースとやりとりをします。
コントローラは何かというと、
モデルからデータを受け取り、ビューにレンダリングする仕組み
Railsドキュメント
というものだそうです。
レンダリングって何だ?renderと関係がありそう。ということで、これも調べてみました。
Railsに組み込まれているさまざまなレンダリング(=レスポンスの出力)方法の使い方
Railsガイドv6.0
レンダリングはレスポンスの出力のことだそうです。つまり、モデルからデータを受け取って、ビューに対してレスポンスを出力するというのがコントローラの役割という感じですかね。
実際のコードを見てみましょう。
def new
@users = User.new
end
(app/controllers/users_controller.rb)
Railsチュートリアルでの解説とは違うアクションを取り出してみました。
newアクションは、Userに対してnewメソッドを呼び出し、@usersに代入してます。Userはさっき作ったモデルですね。newメソッドはデータベースに対して新しいデータを作るように指示するものです。
変数名の頭に@を付けるとインスタンス変数になります。この辺はRubyの知識でいまいち理解できてませんが、そのクラスまたはサブクラスで使える変数のようです。
`@’で始まる変数はインスタンス変数であり、特定のオブジェクトに所属しています。インスタンス変数はそのクラスまたはサブクラスのメソッドから参照できます。
Ruby 2.6.0 リファレンスマニュアル
このインスタンス変数を使うと、Railsではビューでも使えるようになるみたいです。
話を戻します。
usersのコントローラではnewアクションの処理について書いてあります。
では、Userモデルの方には何が書かれてるんでしょうか?
class User < ApplicationRecord
end
(app/models/user.rb)
何やらクラスが定義されてますが、何をするかは書かれてません。このコードは、ApplicationRecordクラスを継承してUserクラスを作るというものです。
クラスの継承は、定義されたクラスの特徴を引き継いで新しいクラスを作ることなので、この時点でUserクラスはApplicationRecordクラスと同じ動きをすることがわかります。
ApplicationRecordクラスがどこで定義されてるかというと、application_record.rbにあります。
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
(app/models/application_record.rb)
ここでもクラスの継承がありますね。ActiveRecord::Baseの場所は見つけられませんでした。Ruby on Railsの本体にあるんじゃないかなと思ってます。
このようにモデルからコントローラにデータが渡され、コントローラがビューを呼び出します。対応するビュー(index.html.erb)を見ると、@usersが使われてるところがありますね。
この辺の詳しい説明はあとの章で出てくるので、とりあえず流れを理解しておけばOKだと思います。
2.2.3 Usersリソースの欠点
ものすごく便利なscaffoldですが、やはり欠点もあるようです。
ここで書かれてることがよくわからなくても、第3章からのアプリケーション開発をやれば意味がわかるようになると思います。
2.3 Micropostsリソース
ここではUsersリソースのところでやったのと同じように、Micropostsリソースを作ります。さらに、UserモデルとMicropostモデルを関連づけます。
2.3.1 マイクロポストを探検する
Usersリソースのときと同じように、rails generate scaffoldを使ってMicropostsリソースを作ります。これは基本的にUsersリソースでやったことと同じなので問題ないですね。
指示通りにやっていきましょう。
2.3.2 マイクロポストをマイクロにする
rails generate scaffoldで作ったばかりのマイクロポストは文字数制限がありません。そこでTwitterと同じように140文字に制限します。
これはモデルに関する制御(?)なので、Micropostモデルにコードを書き込みます。
validates ~~
validateの名詞形はvalidationです。validationは弁証法的行動療法に出てくるので、その辺の知識がある心理職でこれを見てる人は少し違ったイメージを浮かべるかもしれません。
いろんな訳がありますが、僕は「承認」を使ってます。
余談はこの辺にして、validateは承認するとか、有効にするとか、確認するという意味なので、validatesのあとにあるものを機能させるみたいな感じで理解しておくといいかもしれませんね。
ここで重要なのは「validate」ではなく、「validates」であることです。最後の「s」を忘れずに。1周目で「validate」と書いてうまく動かずに無駄な時間を過ごしました。
2.3.3 ユーザーはたくさんのマクロポストを持っている
ここからがUserモデルとMicropostモデルの関連づけです。
この2つのモデルを整理すると、ユーザーはたくさんのマイクロポストを持ってて、各マイクロポストは1人のユーザーと紐づいてるという形ですよね。
図にするとこんな感じです。

ここで、「has_many」と「belongs_to」が出てきて混乱したんですが、言葉の意味から理解すると良さそうです。
「has_many」は「たくさん持ってる」という意味です。ユーザーAはマイクロポストをたくさん持ってるので、「has_many」になります。「User has many microposts」ということですね。
一方のマイクロポストは、ユーザーに紐づいてます。言い方を変えると、特定のユーザーに属してるということになります。なので、「belongs_to」、つまり「属してる」になるわけです。「Micropost belongs to user」ということです。
UserモデルとMicropostモデルの関連づけが終わったら、rails consoleで動作確認です。Progateでもやりましたね。
Railsチュートリアルにコマンドとその結果が載ってますが、コマンドが埋もれてしまってます。よくわからない文字がズラッと並んでると読みたくなくなりますが、「>>」のあとにコマンドが書かれてるので、その通りに打って動きを確認します。
変数名は短い方が楽なので、適当に「user」とか「u」とか「a」とかに変えても問題ありません。
ここの関連づけに関しては解説動画を見た方がわかりやすいと思うので、よくわからないという人は購入をオススメします。

2.3.4 継承の階層
「MVCの挙動」のところで継承についてちょっと触れましたが、Railsチュートリアルではここでその継承の階層を見ていきます。
継承についてはRailsチュートリアルの第4章で出てくるので、ここでは「そういうもんなんだ」くらいで大丈夫だと思います。
2.3.5 アプリケーションをデプロイする
ここまでで第2章で作るアプリケーションは完成です。なので、次はデプロイです。
繰り返しになりますが、1周目ではHerokuへのデプロイを省略するのもありです。
Gitでコミットして、GitHubにプッシュして、Herokuへのデプロイします。デプロイが完了しても、Herokuではエラーが出て表示できません。
これは本番環境(Heroku)ではデーターベースのマイグレーションが実行されてないからです。ということで、指示通りにマイグレーションして、完成です。
まとめ
Railsチュートリアルの第2章では、rails generate scaffoldを使って簡単にRailsアプリケーションを作りました。見た目はかなり質素なものですが、ユーザー登録と投稿という機能があるので、第1章より「アプリケーション」という感じがしますよね。
個人的に第2章で最も重要なところは、「MVCの挙動」だと思います。詳細はこの後で学んでくことになりますが、いろんなものが連動して動くようになってるということをわかった上で進んでくといいかなと思います。
Model-View-Controllerのそれぞれがどういう役割でどう連携してるのかを何となく理解しておくことが重要ですね。1周目はその辺をいい加減に流して、最後の方で大混乱しました。
第2章までは「Ruby on Railsってこんな感じだよ」という導入的なもので、第3章から本格的にRuby on Railsの世界に入ってくことになります。
では、第3章に進みましょう。
