プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Ruby on Rails】パーシャルを使ったビューの共通化、ロジックの共通化、Html…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Ruby on Rails】パーシャルを使ったビューの共通化、ロジックの共通化、HtmlBuilder

11.30

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

ビュー画面の共通化にはrenderメソッドのパーシャルオプション(パーシャルテンプレート)を使います。複数のテンプレートに自由に埋め込める部分テンプレートです。通常のテンプレートと区別するためにアンダースコア「_」で始まるテンプレートをパーシャルとしています。

パーシャルテンプレートの作り方

_(ファイル名).html.slimという先頭に_(アンダースコア)を付けたファイルを作成します。その中に共通化したいHTMLパーツを記述します。

引数の渡し方

なお、モデルオブジェクト等をHTMLに渡したい場合は呼び出すHTML側からローカル変数を渡してもらいそれをそのまま使うことになります。

レイアウト画面の大枠を共通化する。

パーシャルと違ってヘッダーやサイドバー等のテンプレートの外側を共通化したい場合に使います。Railsのアプリを作成した時点では「application.html.slim」がレイアウトになっています。その他レイアウトを作成したい場合は「app/views/layouts」に新しいテンプレートを配置します。

呼び出し方

呼び出す側のHTMLから下記のように記述します。

1
= render partial: 'パーシャルテンプレート名', locals: { パーシャル内のローカル変数(例:user:@user)}

localsオプション

ローカル変数をパーシャルテンプレートに渡しています。例で言えばインスタンス変数「@user」をパーシャル内のローカル変数userとして渡す形になります。もちろん、パーシャルテンプレート内からも直接インスタンス変数を参照することはできますが、明示的にローカル変数として渡すことで依存性が低く再利用性が高いパーシャルを作成することが可能になります。

objectを使った記述方法

1
= render partial: 'パーシャルテンプレート名',object: { パーシャル内のローカル変数(例:@user)}

objectオプションを使えば、パーシャル名(ファイル名のアンダースコアを抜いた名前)と同じ名前のローカル変数をパーシャルに対して渡すことも可能です。

さらなる簡略化

「パーシャル名」と「インスタンス変数名」が同じであれば下記のように簡略化することも可能です。

1
= render @インスタンス変数名

共通化の注意点

早すぎる共通化や過度な共通化は逆にメンテナンス性を下げてしまう可能性があるのでちゃんと用途の見通しを持って共通化して良いかは考えるようにしましょう。

ロジックの共通化

HTMLの共通化以外にロジックの共通化も考えられます。

  • カスタムヘルパーに共通処理を記述する。
  • Decoratorパターンでモデル固有の表示ロジックを分離する。

カスタムヘルパーに共通処理を記述

app/helpers下に一つ一つモジュールとして格納します。

実装のポイント

  • 一つ一つのヘルパーはできるだけ小さく作り何でもやろうとしないこと。
  • 特定モデルに依存する処理はカスタムヘルパーに含めないこと。

例

  • データを加工して表示用文字列を作る等

Decoratorパターンにモデル固有の表示ロジックを分離する。

HtmlBuilderとは?

HTMLソースの生成に特化したモジュールです。

メリット

ERB等のviewテンプレートに組み込むとソースの整理整頓を押し進めることが可能になりリファクタリングがしやすくなります。例えば、重複しているHTML部分を抽出して呼び出すだけでソースが読みやすくなり機能の追加や、バグ対応等がしやすくなります。

デメリット

独自の記法を用いているためまだ慣れていない人にとっては非常に読みづらいコードとなりまし、開発工数がかかります。デザイナーが作成したHTMLをプログラマーが変換する作業が発生するので大変ですし、知らない人があとで見た際に普通のHTMLとは異なるのでキャッチアップに時間がかかってしまいます。デメリットを考慮した上で導入するかは都度判断すると良いでしょう。

Rails内に配置するディレクトリ

1
app/lib

実装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module HtmlBuilder
  def conv_html(tag_name = nil, options = {})
    root = Nokogiri::HTML::DocumentFragment.parse("")
    Nokogiri::HTML::Builder.with(root) do |doc|
      if tag_name
        doc.method_missing(tag_name, options) do
          yield(doc)
        end
      else
        yield(doc)
      end
    end
    root.to_html.html_safe
  end
end

viewヘルパーにモジュールをインクルードします。

1
2
3
module ApplicationHelper
  include HtmlBuilder
end

viewからの呼び出し

1
2
3
4
5
conv_html do |c|
  c.div(class:"test") do
    c.text "テストです。"
  end
end

上記のようなものをviewに記述したら下記のようなソースが生成されます。

1
<div class="test">テストです。</div>

スポンサーリンク
  • 2019 11.30
  • miyabisan2
  • コメントを書く
  • Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2019 12.05

    【Ruby on Rails】「検索機能」の実装(Ransack)

  2. 2019 12.23

    【Docker】Ruby on Railsのコンテナを作成して起動するまで。

  3. 2019 12.01

    【Rspec】FactoryBotでデータを準備する。

  4. 2019 12.08

    【Ruby on Rails】バージョンアップ対策

  5. 2019 11.25

    【Ruby on Rails】フォーム関連のビューヘルパー(form_with等)

  6. 2019 11.23

    【Ruby on Rails】Bundler、Gemfileについて

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Ruby on Rails】ルーティングについての知…

【Ruby on Rails】マイグレーション、マイグ…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー