Sinatra を使って Haml で作成したテンプレートに変数を埋め込む

テンプレートに変数を埋め込む方法を調べてみた。

バージョン (2012/09/26 追記)

Hamlのバージョンは 2.2.2 を使っています。

コントローラ
require 'rubygems'
require 'sinatra'

get '/:id' do
    @id = params[:id]
    @items = ['red', 'green', 'yellow']
    haml :index
end
テンプレート
!!! XML
!!!
%html{html_attrs('ja')}
  %head
    %title= @id 
  %body
    %h1 Hello, @id
    %h1 Hello, #{@id}!
    %h1= "Hello, #{@id}!"
    %h1(class = @id)="Hello, " + @id + "!"
    %h1{:id => @id}= "Hello, ", @id, "!"
  %table
    %tr
      - @items.each do |item|
        %td= item
  - foo = "Thank you"
  - foo << " very"
  - foo += " much!"
  %p= foo
出力HTML
http://sinatra.example.jp:9393/Sinatra

上記 URL にリクエストを送ると、以下のレスポンスが返ってくる。

<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang='ja' xml:lang='ja' xmlns='http://www.w3.org/1999/xhtml'>
  <head>
    <title>Sinatra</title>
  </head>
  <body>
    <h1>Hello, @id</h1>
    <h1>Hello, Sinatra!</h1>
    <h1>Hello, Sinatra!</h1>
    <h1 class='Sinatra'>Hello, Sinatra!</h1>
    <h1 id='Sinatra'>Hello, Sinatra!</h1>
  </body>
  <table>
    <tr>
      <td>red</td>
      <td>green</td>
      <td>yellow</td>
    </tr>
  </table>
  <p>Thank you very much!</p>
</html>
  • タグの後に "=" を付けない場合
    • 変数名をそのまま記述しても変数として認識されない
    • 変数名を "#{ }" で囲むと変数として認識される
    • タグ名以降は "" で囲まれた文字列と同じ扱い?
  • タグの後に "=" を付ける場合
    • リテラルは必ず " や ' で囲む必要がある
    • カンマ区切りにしてもOK
    • = 以降はすべて変数として認識されている?受け取る方は可変引数に対応しているからカンマ区切りでもOKと(調べてない)。
  • 要素の指定は内容よりも前に書く
  • - を付けると Ruby のコードを埋め込むことができる

参考