6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SinatraのNokogiriテンプレート #とは

Last updated at Posted at 2015-12-29

Sinatraがサポートするテンプレート、気が付くとすごく増えてますね。

ここを見ると、

* 利用可能なテンプレート言語
Haml テンプレート
Erb テンプレート
Builder テンプレート
Nokogiri テンプレート
Sass テンプレート
Scss テンプレート
Less テンプレート
Liquid テンプレート
Markdown テンプレート
Textile テンプレート
RDoc テンプレート
AsciiDoc テンプレート
Radius テンプレート
Markaby テンプレート
RABL テンプレート
Slim テンプレート
Creole テンプレート
MediaWiki テンプレート
CoffeeScript テンプレート
Stylus テンプレート
Yajl テンプレート
WLang テンプレート

こんなふうに並んでて圧倒されるんですが、さりげなく "Nokogiri" って入ってます。Nokogiriってあの鋸ですよね。不覚にもまったく気がついていませんでした。

base.rb にちゃんとある・・・

どんなときに使うのかといえば、これはXMLを生成する時に使うんです。
options[:default_content_type] = :xmlって書いてあるし。

作ってみる

では、簡単にのこぎりTemplateを利用するものを作ってみましょう。

app.rb
require 'sinatra'
require 'tilt/nokogiri'

get '/' do
  @name = "hosoi"
  @loop = [1,2,3,4]
  nokogiri :index
end

テンプレートファイルをこんなふうに書いてみます。ほぼruby DSLそのままですね。

index.nokogiri
xml.test {
  @loop.each do |x|
    xml.p(@name, "class" => "test_#{x}")
  end
}

こうすると、レンダリング結果は以下のようになります。ループが処理され、属性と本体が出力されています。

<?xml version="1.0"?>
<test>
  <p class="test_1">hosoi</p>
  <p class="test_2">hosoi</p>
  <p class="test_3">hosoi</p>
  <p class="test_4">hosoi</p>
</test>

valid!

まとめ

Nokogiri と聞いて「ああXPathでスクレイピングするライブラリね」と思っていました。本当にすみませんでした。よく見たらMiddlemanとかのテンプレートにも名を連ねておりますね。なお、ちゃんとビルダーが用意されているのでNokogiri DSLではhtmlも生成できるのですが、NokogiriTemplateクラスを見ると残念なことに xml 決め打ちのようです。

Sinatraを使ってレスポンスにXMLを返したいときには、ぜひ Nokogiri テンプレートをご利用ください。

※ なお、検索してみるとNokogiriでテンプレートエンジンを作っている先人もいるようです。不明を恥じるばかりです。

6
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?