SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール

テンプレートエンジンSlimでRails開発を効率化しよう

これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール 第6回

既存のRailsアプリケーションへのSlim導入

 テンプレートエンジンにERBを採用している、既存のRailsアプリケーションに、Slimを導入する方法も紹介しておきます。

 既にRailsアプリケーションをERBで開発している場合、先ほど紹介したerb2slimコマンドの引数に、ビューのディレクトリを指定して一括置換することができます。

bin/bundle exec erb2slim -d app/views

 実行すると、app/viewsディレクトリ配下にあるすべてのERBファイルがSlimに置き換わります。なお、上記のようにビューディレクトリ全体を指定するとActionMailer用のメール送信時のビューテンプレートも置換されます。メール送信時のテンプレートをERBのままで運用したい場合は、erb2slimコマンドの引数に置換したいディレクトリを個別で指定して実行するなどの配慮が必要です。

Slimの各種構文

 ここからはSlimの構文について具体的に確認していきます。

テキストを出力する "|"

 先ほど、erb2slimコマンドで置換したレイアウトファイルを再度確認します。

[リスト5]app/views/layouts/application.html.slim
…(中略)…
    title
      | SlimSample
…(中略)…

 Slimでテキストを出力するには、titleタグの次の行の通り、 |を用います。この記述で出力されるHTMLタグは以下の通りです。

<title>SlimSample</title>

 実際にPumaサーバーを起動してtitleタグの出力結果を確認してみてください。

 なお、HTMLタグに囲まれたテキストの出力は、HTMLタグの定義の後、改行せず半角スペースに続けて記述することで以下の通り |を省略することもできます。

    title SlimSample

Rubyのコードを記述する "-" 

 Rubyのコードを記述するには、 -(ハイフン)を用います。ERBでは、<%- %>という記述に相当するものです。

 Scaffoldで作成したビューファイルを確認します。

[リスト6]app/views/articles/index.html.slim
…(中略)…
    - @articles.each do |article|
…(中略)…

 コントローラーでアサインした@articlesインスタンス変数をeachメソッドでループする箇所です。eachメソッドは直接的にHTMLタグの出力をともなわないので、ERBでの記述のうち、<% %>を省略した記述方法を採ることができます。-(ハイフン)以降の文字列はRubyのプログラムとして解釈されます。

Rubyのコードを出力する "=" 

 同じビューファイルにおける、eachメソッドの直後の部分を確認します。

[リスト7]app/views/articles/index.html.slim
…(中略)…
        td = article.title
        td = article.body
…(中略)…

 ここはarticleのtitle、bodyを出力している箇所です。ERBでは、<%= %>に相当するもので、先ほど同様、<% %>を省略した記述です。=(イコール)以降の文字列はRubyのプログラムとして解釈されます。

コードをコメントアウトする "/" 

  /(スラッシュ)をHTMLタグ定義の前に置くと、HTMLタグが出力されなくなります。つまり、コメントアウトに相当するものです。SlimではインデントによってHTMLの階層構造を表現しているので、コメントアウトするとインデントされたブロックごとコメントアウトされます。

 先ほど確認したビューファイルのtableタグをコメントアウトします。

[リスト8]app/views/articles/index.html.slim
…(中略)…
/table
  thead
    tr
      th Title
      th Body
…(中略)…

 Pumaサーバーを起動し「http://localhost:3000/articles」にアクセスすると該当するtableタグが出力されないことが確認できます。

tableタグのコメントアウト結果
tableタグのコメントアウト結果

id/class属性の省略記法

 Scaffoldで生成された、入力フォーム用のパーシャルを確認します。

[リスト9]app/views/articles/_form.html.slim
…(中略)…
  - if @article.errors.any?
    #error_explanation
      h2 = "#{pluralize(@article.errors.count, "error")} prohibited this article from being saved:"
      ul
        - @article.errors.full_messages.each do |message|
          li = message

  .field
    = f.label :title
    = f.text_field :title
…(中略)…

 バリデーションエラー時のブロックに「#error_explanation」という記述があります。これは以下のHTMLタグを出力します。

<div id='error_explanation'>〜</div>

  #(シャープ)は、後に続く文字列をHTMLタグのid属性として扱います。また、HTMLタグのうち頻繁に使うdivタグはこのように省略することができます。つまり「#error_explanation」は「div#error_explanation」と等価です。慣れないうちはこの記述方法に違和感を抱くかもしれませんが、頻出するdivタグを省略できるのでより実践的なビューを記述する際、タイプ数が少なく済むメリットを感じることができます。

 同様に .(ドット)は、後に続く文字列をHTMLタグのclass属性として扱います。「.field」という記述は「div.field」と等価で、以下のHTMLタグを出力します。

<div class='field'>〜</div>

複数の属性がある場合の記法

 タグの後に、属性を複数指定することもできます。

 Scaffoldで作成した一覧ページにGoogleのトップページへのリンク(aタグ)を設置するには以下のように記述します。

[リスト10]app/views/articles/index.html.slim
…(中略)…
= link_to 'New Article', new_article_path

div
  a href='https://www.google.co.jp/' title='Google' Googleトップページ

Rubyのコードをテキストに展開する記法

 先ほど提示した入力フォームのパーシャルのバリデーションエラー時の部分を再度確認します。

[リスト11]app/views/articles/_form.html.slim
…(中略)…
      h2 = "#{pluralize(@article.errors.count, "error")} prohibited this article from being saved:"
…(中略)…

 このように、Rubyの式展開の演算子である #{}を使うことで、Rubyのコードをテキストに展開することができます。

埋め込みエンジン

 Slimには、他のテンプレートエンジンの記述方法を取り込む仕組みも備わっています。この仕組みはフィルタとして提供されており、 フィルタ名:のように宣言して使います。フィルタにはさまざまな種類がありますが、ここでは、マークダウン記法を簡単に導入するためのmarkdown:フィルタを紹介します。

 マークダウン記法で記述するトップページを以下の通り作成していきます。

[リスト12]config/routes.rb
…(中略)…
root to: 'home#index'
…(中略)…
[リスト13]app/controllers/home_controller.rb
class HomeController < ApplicationController
  def index
  end
end
[リスト14]app/views/home/index.html.slim
markdown:
  # プログラミング言語

  ## コンパイル型言語
  - C
  - Go

  ## スクリプト言語
  - Ruby
    - 開発者はmatz
  - Python

 マークダウンフィルタは、マークダウンを解釈するgemに依存しています。ここではredcarpetというgemをインストールします。

[リスト15]Gemfile
…(中略)…
gem 'redcarpet'
…(中略)…
bin/bundle inst

 Pumaサーバーを起動し「http://localhost:3000」にアクセスすると、マークダウンが解釈され以下の通り表示されます。

マークダウン記法で記述したトップページ
マークダウン記法で記述したトップページ

まとめ

 ここまで、テンプレートエンジンであるSlimの概要を紹介し、主要な記法を確認するとともに実際に記述して動作を検証しました。今回ご紹介した記法以外にも便利な記法があります。詳細は日本語版のREADMEを参照してみてください。

 次回は、連載2回にわたり、SEO対策で重宝するgemである以下の3つを紹介する予定です。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 竹馬 力(チクバ ツトム)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11129 2018/10/17 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー