はじめに
Ruby on Railsのデフォルトのテンプレートエンジンは「ERB (Embedded Ruby)」です。ERBは通常のHTMLにRubyコードを埋め込むためのテンプレートエンジンです。しかし、RailsがサポートしているテンプレートエンジンはERBだけではありません。「Slim」は、その名の通りスリムに書くことができるテンプレートエンジンです。
本記事では、テンプレートエンジン「Slim」を使用する際に覚えておくべきことをまとめています。
Slimの書き方
SlimはERBに比べて簡素に書けるテンプレートエンジンです。書き方は公式のドキュメントなどにまとまっているのでそちらを参照してください。
ERBとSlimの双方向変換
ERBをSlimに変換
RailsのデフォルトのテンプレートエンジンはERBなので、ある程度実装してからSlimを導入しようとすると、既存のERBをSlimに直す必要があります。1つ1つ手動で直すには大変なので、専用のGemを使って変換することができます。
Gemfileに以下を追記し、bundle install
を行います。
group development do
gem 'html2slim'
end
上記のGemをインストールすると、html2slim
とerb2slim
という2つのコマンドが使えるようになります。ERBを変換するには後者のコマンドを実行します。
$ bundle exec erb2slim [File or Directory] [-d]
ファイルを指定するとそのファイルが、ディレクトリを指定すると配下のファイルすべてがSlimに変換されます。
-d
オプションをつけると変換後に元のファイル(ERB)が削除されます。-d
オプションをつけずに変換し、その後ERBを削除したくなったら、今度は-d
オプションをつけて再実行すれば削除されます。
初めはERBとSlimの比較のために両方残しておき、必要なくなってからERBを削除するということができます。ただし、ERBとSlim両方のファイルがある場合、ERBが優先してレンダリングされます。
html2slim
によるERB→Slim変換は完璧ではありません。ERBの書き方によってはSlimに変換してから少し書き直す必要があるかもしれません。後述する「Slim変換後のリファクタリング」セクションもあわせて参照してください。
SlimをERBに変換
ネット上の技術情報を見ているとサンプルコードがSlimだけで書かれている場合がよくあります。Slimの書き方に不慣れなうちはERBの書き方も見たいときがあります。SlimからERBはコマンドラインツールで変換することができます。
Gemfileに以下を追記し、bundle install
を行います。
gem 'slim-rails'
上記のGemをインストールすると、slimrb
というコマンドが使えるようになります。
$ bundle exec slimrb --erb
ul#articles
- @articles.each do |article|
li.article
= link_to article.title, article_path(article.id)
[Ctrl+d]
標準入力からSlimを入力し、最後の空行でCtrl+d
(WindowsはCtrl+z
)を入力するとERBに変換されます。あくまで補助的なツールとして提供されているものなので、それほどきれいなフォーマットでは変換はされません。
Slim変換後のリファクタリング
html2slim
によるERB→Slim変換は完璧ではありません。ERBの書き方によってはSlimに変換してから少し書き直す必要があるかもしれません。ここで紹介している以外にも、インデントがおかしかったり不要な空行が挿入されていたりすることがあるので、Slimに変換したら一度すべてのファイルをチェックしてみることをおすすめします。
Rubyコードの途中改行
可読性のためにRubyコードを途中で改行していることがあります。例えば、以下のようなRubyコードがあるとします(あえて長くしています)。
<%= link_to '削除', article_path(article.id), id: "delete-article-#{article.id}", class: 'delete-article',
method: :delete, remote: true, data { confirm: '本当に削除しますか?' } %>
上記を含むERBをSlimに変換すると以下のようになります。
= link_to '削除', article_path(article.id), id: "delete-article-#{article.id}", class: 'delete-article',
- method: :delete, remote: true, data { confirm: '本当に削除しますか?' }
途中改行している2行目がうまく変換できていません。当然、このままではSlimの構文エラーになります。
= link_to '削除', article_path(article.id), id: "delete-article-#{article.id}", class: 'delete-article',\
method: :delete, remote: true, data { confirm: '本当に削除しますか?' }
Rubyコードを途中改行する場合は末尾に\
(バックスラッシュ)または,
(カンマ)をつけます。2行目の先頭の-
(ハイフン)は不要なので削除します。
HTMLエスケープ
SlimはデフォルトでHTMLエスケープを行うため、そのままでは期待通りにエンコードされない場合があります。特に、KaminariというGemを使ってページネーションを実装している場合は必ずリファクタリングする必要があります。
以下はKaminariが生成するビューkaminari/_paginator.html.slim
です(Slim変換直後)。
= paginator.render do
nav
ul.pagination
= first_page_tag unless current_page.first?
= prev_page_tag unless current_page.first?
- each_page do |page|
- if page.left_outer? || page.right_outer? || page.inside_window?
= page_tag page
- elsif !page.was_truncated?
= gap_tag
= next_page_tag unless current_page.last?
= last_page_tag unless current_page.last?
=
(単一等号)はescape_html
メソッドによるHTMLエスケープが行われます。HTMLエスケープを行いたくない場合は==
(二重等号)を使います。
= paginator.render do
nav
ul.pagination
== first_page_tag unless current_page.first?
== prev_page_tag unless current_page.first?
- each_page do |page|
- if page.left_outer? || page.right_outer? || page.inside_window?
== page_tag page
- elsif !page.was_truncated?
== gap_tag
== next_page_tag unless current_page.last?
== last_page_tag unless current_page.last?
slimとslim-rails
Rubyにはslim
とslim-rails
という2つのGemがあります。slim
はテンプレートエンジンのみで、slim-rails
はそれに加えてRailsのジェネレーターコマンドで作成されるビューもSlimになります。特段の理由がなければslim-rails
を使えば問題ないかと思います。
また、アプリケーション設定で以下の設定をしなくても、slim-rails
をインストールしているだけでジェネレーターコマンドで作成されるビューもSlimになります。
# 以下の設定は不要
config.generators.template_engine = :slim
まとめ
SlimはERBと比べて簡素に書くことができますが、その分習熟には時間がかかるかもしれません。特に、HTMLやERBに長く親しんだという人ほどSlimへの移行には時間がかかります。まずは、既存のERBとSlimを見比べながら徐々にシフトしていくのがいいかと思います。
本記事を参考にして、テンプレートエンジン「Slim」を使っていただければと思います。