Railsのアプリケーション、どこから読むか?
RailsエンジニアはFizzyを読んでみよう
Railsの生みの親であるDHHがCTOを務める37SignalsからFizzyというプロダクトがリリースされました。シンプルな機能を謳っているカンバンアプリケーションです。 サーバーにインストールして使えるものとSaaS版があり、どちらもGitHubでコードが公開されています。
37SignalsのRailsのコードは高品質であり、 コードベースは中規模程度のRailsアプリケーションになっていて、実運用でも大変参考になると考えています。
あまりRailsのコードリーディングをしたことがない人に向けて、私がどのような順番で読んでいるかを言語化して紹介していきます。
Railsアプリケーションを読む順番
前提としてアプリケーションは触っておく
できれば開発環境を構築してアプリケーションを動かし、一通り動作確認をしておきましょう。 Railsアプリケーションの場合はURL構造などからざっくり構造を把握する事もできるので、 先に動かして勘所を掴んでおくことをおすすめしておきます。
schema.rbをながめる
私は一番最初にテーブル設計を見ます。
ここがどのようなテーブル設計になっているかをざっくり眺めてみましょう。これだけでサービスの全容がなんとなくわかります。search_records_0 というようなテーブルがあるだけで、もしかするとRDBMSで検索を実現しているのでは…?ということが見えてくるかと思います。
面倒であれば生成AIにテーブル設計の関連図を作ってもらうのも手だと思います。
Controllerをながめる
routes.rbを眺めつつ、気になるURLの処理を行っているControllerのコードをチェックしましょう。ここからModelや気になるクラスのコードを見てゆきましょう。
Modelをながめる
ざっくりschema.rbやControllerを眺めたところでどんなモデルが有るか?どのような機能がありそうか、なんとなく見えてきたかと思います。そこから気になるところをチェックしてみましょう。
特に何もなければユーザー関連から眺めてみる
特に見たい箇所がない場合はユーザー関連からチェックすればいいと思います。 モデルで処理が集中するのはユーザーに関連する処理だと思っています。雑に眺めて見るだけでも参考になる部分や逆に辛さも見えてくるので面白いです。
Fizzyのみどころ
年末年始にFizzyを読みたくなるようにいくつか見どころを紹介しておきます。 ネタバレしてしまうと良くないので2つ程度の紹介に留めておきます。
洗練された厚いModel・とにかく薄いController
Controllerの実装が下記のようにかなり洗練されていて、とにかくControllerが薄いです。
class Cards::BoardsController < ApplicationController
include BoardScoped
skip_before_action :set_board, only: %i[ edit ]
before_action :set_card
def edit
@boards = Current.user.boards.ordered_by_recently_accessed
fresh_when @boards
end
def update
@card.move_to(@board)
respond_to do |format|
format.html { redirect_to @card }
format.json { head :no_content }
end
end
private
def set_card
@card = Current.user.accessible_cards.find_by!(number: params[:card_id])
end
end
モデルにとにかく処理が寄せられています。
とにかくModule・Concernを駆使している
カンバンの肝になるCardというモデルがありますが、1つのモデルがFatにならないようにとにかく処理が分割されています。
Card::CloseableやCard::Assignableを始めとして、かなりの数がConcernに分離されています。これによってcard.rbは147行程度に抑えられていました。
Plan B
詳しい解説はここではしませんが、SaaS版も元々sqliteだけで戦おうとしていたところをMySQLに置き換えるという豪胆なことをしているPRを見かけました。
かなり濃密なPRになっており臨場感があります。
おわりに
Railsのコードリーディングに慣れていない人にとっても、「どこから読めばいいのか」「何を見れば設計意図がわかるのか」という観点を持つだけで、コードから得られる情報量は大きく変わります。
少しまとまった時間に、Fizzyを動かし、schema.rbを眺め、ControllerやModelを追ってみてください。自分のプロジェクトに持ち帰れるヒントがいくつも見つかるかと思います。