Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Components in Rails without gems

2025年09月26日に「Dev.to」が公開したITニュース「Components in Rails without gems」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Railsでgemを使わず、UIコンポーネントを開発する方法を解説する。ComponentHelperを中心にパーシャルやレイアウトを扱い、ビューロジックの分離、デコレーターやクラス活用で、メンテナンス性の高いコードを実現する。

出典: Components in Rails without gems | Dev.to公開日:

ITニュース解説

Webアプリケーション開発フレームワークであるRailsでは、ユーザーインターフェース(UI)の部品を再利用可能なコンポーネントとして管理する方法がいくつか存在する。通常、Railsの標準機能であるパーシャル(部分テンプレート)は、UI要素を分割して再利用するのに役立つが、アプリケーションが大規模になるにつれて、コードの保守性やビューファイル内に複雑なロジックが混在するといった課題に直面することがある。また、ヘルパーメソッドも同様の目的で利用されるが、そのグローバルなスコープが時にコードの管理を難しくする場合がある。ViewComponentのような人気の高いサードパーティ製ライブラリ(gem)を使用すれば、これらの問題を解決できるが、プロジェクトの制約や顧客の要望によっては、追加のgemに依存できない状況も発生する。本記事は、このような状況下でも、Railsの既存機能を活用して、保守性の高いコンポーネントシステムを構築するための様々なテクニックについて解説する。

まず、基盤となるのは「Component Helper」と呼ばれる独自のヘルパーモジュールである。これはRailsの標準的なレンダリング(描画)メソッドをより簡潔な形で呼び出せるようにラップしたものだ。具体的には、componentというメソッドを通じて、コンポーネント名と、そのコンポーネント内で利用するローカル変数(データ)を渡す。このヘルパーは、与えられた引数に応じて適切なレンダリング方法を自動的に判断する。例えば、コンテンツブロック(特定のHTML要素で囲みたい内容など)が指定された場合は、コンポーネントをレイアウトとして扱い、ブロック内のコンテンツをコンポーネントのテンプレートに渡す。複数のアイテムを一覧表示したい場合は、コレクション(データの集まり)を受け取り、その各アイテムに対してコンポーネントを繰り返し描画する。それ以外の場合は、通常のパーシャルとしてコンポーネントを描画する。すべてのコンポーネントは、app/views/components/ディレクトリに、パーシャルの命名規則に従ってアンダースコアを付けたファイル名で配置されることが期待される。

次に、コンポーネントに必要な変数を明確にする「明示的なローカル変数」の活用が挙げられる。Rails 7.2で導入されたこの機能は、コンポーネントのテンプレートファイルの先頭に<%# locals: (変数名: データ型, 変数名: デフォルト値) %>のような形で記述することで、そのコンポーネントがどのような変数を受け取るのか、またデフォルト値がある場合は何かを明確に定義できる。これにより、コンポーネントのインターフェースがはっきりとわかるため、利用する側は必要なデータを間違いなく渡すことができ、コードの可読性と堅牢性が向上する。例えば、ユーザーのアバターを表示するavatarコンポーネントでは、userというデータが必須であることや、sizecssといった変数にデフォルト値が設定されていることを明示できる。この機能は、コレクションと組み合わせて使用する際にも有効で、各アイテムがどのような変数名でコンポーネントに渡されるかを指定できる。

さらに、特定のコンテンツを内部に含めることができる「コンテンツブロックを持つコンポーネント」の利用も重要なテクニックだ。これは、コンポーネントのテンプレート内で<%= yield %>と記述することで実現される。yieldは、コンポーネントを呼び出す際にcomponentヘルパーに渡されたブロックの内容を、その位置に挿入する役割を持つ。例えば、ウェブページのセクションを構成するsectionコンポーネントや、ウェブサイトの階層を示すパンくずリスト(breadcrumbs)コンポーネントなどがこれに該当する。これらのコンポーネントは、共通の見た目や構造を提供しつつ、内部に様々な種類のコンテンツを柔軟に配置できるため、UIの一貫性を保ちながら多様なコンテンツに対応できる。パンくずリストの例では、リンクのリストを渡しつつ、最後の項目はブロックとして渡すことで、動的に変化する現在のページ名を表現するといった使い方が可能である。

ビュー固有のロジックをモデルから分離するためには「デコレーター」パターンが役立つ。Railsのモデル(データベースのデータに対応するクラス)はデータの管理に集中し、特定のビューでの表示方法に関するロジック(例えば、アバターのCSSクラスを生成するロジックなど)は、別途デコレータークラスに記述する。これにより、モデルは純粋なデータ層としての役割を保ち、ビュー関連のロジックがモデルに混入するのを防ぐことができる。User::Decoratorクラスの例では、avatar_cssというメソッドを定義し、ユーザーオブジェクトに適用することで、ビュー側ではモデルから直接呼び出すかのように、ビューに特化した情報にアクセスできるようになる。このアプローチは、コードの役割分担を明確にし、保守性を高める上で非常に有効である。

最後に、より複雑なロジックや状態を管理する必要があるコンポーネントには「クラスベースのコンポーネント」が有効である。これは、特定のUIコンポーネントのためだけにRubyのクラスを定義し、そのクラスがコンポーネントのロジックや振る舞いをカプセル化(まとめること)する方法だ。例えば、バッジを表示するBadgeComponentクラスでは、バッジの種類(ウェブマスター、パワーユーザーなど)に応じて、表示名や適用されるCSSクラスを決定するロジックをすべてこのクラス内に持つ。ビューテンプレートは、このBadgeComponentのインスタンスを生成し、そのインスタンスが提供するメソッド(例:badge.name, badge.css)を利用してHTMLをレンダリングする。この方法は、ViewComponentのようなgemが提供する機能に非常に近いものであり、コンポーネントのロジックをビューファイルから完全に分離し、テストを容易にし、コードの再利用性と保守性を大幅に向上させる。

これらのテクニックを組み合わせることで、サードパーティ製gemに依存することなく、Railsの標準機能とRubyの力を活用し、モジュール化され、再利用可能で、そして何よりも保守しやすいUIコンポーネントシステムを構築できる。これにより、開発者はクリーンなコードを維持しつつ、効率的にUIを開発することが可能となる。

関連コンテンツ

関連IT用語