今やっている個人プロジェクトのテンプレートエンジンはslimを使っています。
erbに比べると完結に書くことができるし、閉じタグを書かなくていいので、htmlを書くのは非常に楽です。
で、ですよ。
昨今のWebアプリはAjaxは当たり前。なので、slimでhoge.js.slimというAjaxでのアクセスに対するレスポンスを書こうとしたら、どうすればいいのか?最初全然わかりませんでした。
ググってみたら、上手に書いている人がいたので、メモ書きとして残します。
| $(".content").append("#{escape_javascript(render "hoge")}"); // _hoge.html.slimをレンダリングしたものをエスケープ
こうです!
slimの場合、先頭に|を持ってくることで、テキストとしてそのまま書くことができます。
Rubyの部分は#{…}の中に書くことができるので、それで対応できるということでした。
しかし、このソースを見ていると個人的にはなんだか気持ち悪いです…。気持ち悪いというかダサいというか…。そこかしこにJavaScriptのコードが散るのはあまり好きでないですし、ましてやassets側のほうはCoffeeScriptで書いているので、ここでJavaScriptかよ…という感じが非常に違和感。
かといってjsonで受け取ってCoffeeScript側でjsonを分解してhtmlを作ってappendするのもダサい。
hoge.html.slimをレイアウトなしで返して、CoffeeScript側のコールバックでappendするのが見た目にもソース的にもよいのかなぁというイメージです。やっぱりhoge.js.slimは止めようかなぁ…。
追記:hoge.js.slimやめました。
やっぱりJavaScriptが散らかるので、止めることにしました。
コントローラー側では、
render layout: false
に設定して、CoffeeScriptのコールバック側でappendしました。
このほうが、CoffeeScript側でやっていることが明確でいいですね。
というわけで、hoge.js.slimはオススメしません。個人的に。