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 のコードを埋め込むことができる
参考