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::CloseableCard::Assignableを始めとして、かなりの数がConcernに分離されています。これによってcard.rbは147行程度に抑えられていました。

Plan B

詳しい解説はここではしませんが、SaaS版も元々sqliteだけで戦おうとしていたところをMySQLに置き換えるという豪胆なことをしているPRを見かけました。

かなり濃密なPRになっており臨場感があります。

おわりに

Railsのコードリーディングに慣れていない人にとっても、「どこから読めばいいのか」「何を見れば設計意図がわかるのか」という観点を持つだけで、コードから得られる情報量は大きく変わります。

少しまとまった時間に、Fizzyを動かし、schema.rbを眺め、ControllerやModelを追ってみてください。自分のプロジェクトに持ち帰れるヒントがいくつも見つかるかと思います。