← 前へ: Phase 5.2 | 目次 | 次へ: Phase 5.4 →
実行前に共通セットアップと各Phaseの確認手順を確認してください。演習コードはwork/で前のPhaseから引き継ぎます。
このフェーズでは、Phase 5.2で導入した Model を、 WebブラウザやControllerを経由せずに対話的に扱える Consoleモード を実装します。
Phase 5.2の時点で、User.all や User.find は動作しているはずです。
しかし、それらを確認するために毎回HTTPリクエストを発生させたり、 ControllerやViewを経由したりしていると、Model単体の挙動が見えにくくなります。
このフェーズでは、それを解決するために、
「自作ORMを対話的に検証できる入口」
として、最小限のConsoleモードを作ります。
Railsにおける rails console がなぜ重要なのかも、
このフェーズを通じて理解できるようになります。
以下を説明できる状態になること:
- Consoleモードとは何か
- なぜWebリクエストなしでModelを触りたいのか
- なぜORMの検証に対話環境が向いているのか
- Rails console が何をしているのか
- テストとConsoleの役割の違い
bin/consoleのような起動スクリプトを持てる- アプリケーションコードを読み込んだ状態でIRBを起動できる
- Console上で
User.all/User.findを試せる - Controllerを経由せずにModelの挙動を確認できる
- 今後のORM開発でConsoleを検証ツールとして使える
- Phase 5.2(1テーブル専用Model)完了
User.all,User.findが動作している- DB接続がアプリケーション内で使える状態
Ruby 4ではBundler経由でIRBを読み込めるよう、Gemfileにgem "irb"を記載します。演習用Gemfileには追加済みです。
bin/consoleConsole起動後:
User.all
User.find(1)※ このフェーズでは、まだ高度なORM機能は前提にしません
※ where, save, validation などは後続フェーズで扱います
まずは、なぜConsoleがあると便利なのかを整理します。
以下を考察してください:
- なぜブラウザを開かずにModelを触りたいのか?
- なぜControllerを通さずに
User.allを試したいのか? - Webリクエストなしで検証できる価値は何か?
ModelやORMの挙動を確認したいだけなら、HTTPの流れ全体は不要
まずは、IRBを起動するだけのスクリプトを作ってください。
以下のようなコマンドで起動できること:
bin/console- Ruby標準の
IRBを利用できる bin/consoleは実行可能ファイルにする必要がある- 最初はアプリケーションコードを読み込めなくてもよい
このフェーズでは独自REPLを作る必要はありません。
Console起動時に、Phase 5.2までで作ったModelを利用できる状態にしてください。
Console起動後に以下を評価できること:
UserUserクラスはどのファイルに定義されているか?require_relativeはどのパスから解決されるか?- アプリケーションの初期化処理はどこに集約されているか?
User クラスだけでなく、DB接続も使える状態にしてください。
Console起動後に以下を試してください:
User.all
User.find(1)- DB接続はConsole起動時に準備されているか?
- Webリクエスト時と同じ接続設定を使えているか?
- テストDBと開発DBをどう区別するか?
同じ User.all を、Controller経由とConsole経由で比較してください。
- Controllerが担当していること
- Modelが担当していること
- Consoleから直接見えること
- Web画面だけでは見えにくいこと
Consoleを使うと、Modelの責務だけを切り出して観察できる
Console上で、今の User.all / User.find の戻り値を詳しく観察してください。
以下を試してください:
users = User.all
user = User.find(1)
users.class
user.classUser.allの戻り値は自然か?User.find(1)の戻り値は「Userらしい」か?user["name"]のようなアクセスに違和感はないか?
ここで出てくる違和感が、次のフェーズで扱う 「レコードをオブジェクトとして扱う」動機になります。
このPhaseで作るConsoleは、この先のORM開発で継続して使います。
Phase 5.4以降では、新しい機能を実装するたびに、 テストだけでなくConsoleでも実際に触ってください。
例:
- Phase 5.4:
user.nameが自然に使えるか確認する - Phase 5.5:
User.where(name: "Alice")のAPIが自然か確認する - Phase 5.6:
user.save後にDBが変化するか確認する - Phase 5.7: validation error を対話的に確認する
- Phase 5.8: BaseModel化しても
User.allが壊れていないか確認する
Consoleはテストの代替ではありません。
ただし、APIの使いやすさ、違和感、設計の粗さを発見するための 重要な道具です。
実際に Rails console が何をしているか調べてください。
- なぜ
User.allがすぐ使えるのか? - Console起動時に何が読み込まれているか?
- IRB単体と何が違うのか?
- Rails console は単なるIRBか?
- アプリケーション環境とは何か?
以下を説明してください:
- Consoleは何のためにあるのか
- なぜORMと相性が良いのか
- なぜConsoleはテストの代替ではないのか
- なぜ今後のORM開発でConsoleを使い続けるのか
このフェーズで得るべき理解は:
Consoleは便利機能ではなく、 自作したModelやORMを開発者として対話的に検証するための入口である
Consoleで User.all や User.find を触ると、必ず次の違和感が出ます:
- 戻り値がただの配列やハッシュに見える
user["name"]のようなアクセスが気持ち悪い- 「User」と言っているのにRubyオブジェクトらしくない
次のフェーズではこれを解決します:
👉 Phase 5.4: レコードをオブジェクトとして扱う(ORMの核心)