スキップしてメイン コンテンツに移動

ActionViewで共通化

ActionViewで共通化

ActionViewとERBの基本

Ruby on Rails のビュー層は ActionView が担い、テンプレートエンジンとして ERB が標準で使用されます。ERB は Ruby コードを埋め込んだまま HTML を生成できるため、Ruby 応用の一環として非常に便利です。例えば、app/views/users/show.html.erb では <%= @user.name %> のように Ruby 変数をそのまま埋め込むことができます。

ActionView はテンプレートをレンダリングする際に、ActionView::Base を通じてコンテキストを提供します。これにより、コントローラで設定したインスタンス変数がビュー内で直接参照可能になります。ERB の構文はシンプルで、<% %> で Ruby コードを実行し、<%= %> で結果を出力します。

Helperでロジックを分離

ビューに直接ビジネスロジックを書き込むと、コードが肥大化し保守性が低下します。そこで Rails では Helper を使ってロジックを分離します。Helper は app/helpers 配下に置かれ、module UsersHelper のように定義されます。

例えば、ユーザーのフルネームを表示するロジックを full_name(user) というメソッドにまとめると、ERB 内では <%= full_name(@user) %> のように呼び出せます。これにより、テンプレートは「何を表示するか」に集中でき、ロジックの変更は Helper のみで済みます。

Partialで再利用性を高める

同じ UI 部分を複数のテンプレートで使い回す場合、Partial を利用します。Partial は _form.html.erb のようにアンダースコアで始まるファイル名で定義され、render 'form', user: @user のように呼び出します。

Partial はコンテキストを受け取り、locals で渡された変数を使って描画します。これにより、同じフォームを新規作成と編集で使い回すことができ、コードの重複を防げます。また、Partial 内で Helper を呼び出すことで、ロジックと UI をさらに分離できます。

Layoutで共通化を実現

アプリ全体で共通のヘッダーやフッター、ナビゲーションを持つ場合、Layout を使って共通化します。Layout は app/views/layouts/application.html.erb に置かれ、yield で各テンプレートの内容を挿入します。

Layout 内で content_for を使えば、ページごとに異なるタイトルやメタ情報を設定できます。さらに、render 'shared/header' のように Partial を組み合わせることで、ヘッダー部分も再利用可能です。これにより、HTML 生成の共通化が実現し、全体の保守性が向上します。

実践例:HTML生成の共通化

実際に Ruby 応用で HTML を生成する際のパターンを紹介します。まず、共通のカード UI を Partial として作成し、Helper でデータ整形を行います。次に、Layout で全体のレイアウトを統一し、必要に応じて content_for でページ固有のスタイルを追加します。

以下は簡易的な例です。
app/helpers/cards_helper.rbcard_title(user) を定義し、app/views/shared/_card.html.erb<%= card_title(user) %> を呼び出します。
app/views/layouts/application.html.erb では <%= yield %> の前に共通ヘッダーを挿入し、全ページで同じナビゲーションを表示します。
こうした構成により、HTML 生成の共通化が実現し、開発速度と品質が向上します。

この記事はAIによって作成されました。

コメント