はじめに
Railsを2年くらいやってたエンジニアがJavaをキャッチアップしてみた所感をまとめた投稿です。
Ruby(Rails)では何となく書いても動いた、ある種の黒魔術的な仕組みについて、Javaを学ぶことで紐解いていきます。
対象者
- RubyonRailsの初学者
- Javaの初学者
基本構文の違い
RailsのERBとJavaのThymeleafでは、オブジェクトの反復処理に以下のような違いがあります。
テンプレート | 基本構文 | 特徴 |
---|---|---|
ERB (Rails) | <% @items.each do item %> |
Rubyのeachメソッドを使用。ブロック変数で要素を取得 |
Thymeleaf | th:each="item : ${items}" |
HTML属性として記述。自然なテンプレートを維持 |
インデックス取得方法
ERB:
<% @items.each_with_index do |item, index| %>
<%= index %>: <%= item.name %>
<% end %>
Thymeleaf:
<tr th:each="item, iterStat : ${items}">
<td th:text="${iterStat.index}">0</td>
<td th:text="${item.name}">Item</td>
</tr>
状態変数(iterStat)で追加情報取得可能:
種類 | 特徴 |
---|---|
index | 0始まりインデックス |
count | 1始まりインデックス |
size | コレクションサイズ |
first/last | 最初/最後の要素判定 |
条件分岐との連携
ERB:
<% @items.each do |item| %>
<% if item.active? %>
<%= item.name %>
<% end %>
<% end %>
Thymeleaf:
<div th:each="item : ${items}"
th:if="${item.active}">
<span th:text="${item.name}"></span>
</div>
(補足)状態変数の違い
-
ERBは状態変数を自前で用意
(each_with_indexなど)する必要があり、得られるのは主にインデックスのみ。 -
Thymeleafは組み込みのステータス変数(例:iterStat)があり、インデックスだけでなく、カウント・サイズ・先頭/末尾判定など多彩な情報を1行で取得できる
主な特長比較
特徴 | ERB | Thymeleaf |
---|---|---|
構文タイプ | 埋め込み式 | 属性ベース |
静的プレビュー | 不可 | 可能(自然テンプレート) |
状態変数 | 自前実装 | 組み込み(iterStat) |
スコープ | ブロック内 | 要素内 |
HTML整合性 | 崩れやすい | 維持される |
パフォーマンス面
ERB:Rubyの実行環境に依存
Thymeleaf:キャッシュ機構を活用可能
// キャッシュ設定例(Thymeleaf)
templateResolver.setCacheable(true);
大きな違いは?
-
Thymeleaf
HTML構造を保ちつつ状態管理が容易である。 -
ERB
Rubyの柔軟性を活かした記述が可能。
プロジェクトの要件に応じて、適切なテンプレートエンジンを選択することが重要です。
まとめ
インデックス管理などに関しては、ERB(Rails)では自動で管理してくれていたので気にしなかったこともあり、Thymeleaf(Java)を触ってから考えることが多くなりました。
完全に主観ですが、Javaを学んでると、点と点が線で繋がるような体験をたまに味わいますね。