(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

Padrino で Jbuilder を使う

なんか今ふたつ方法があるぽくて、以下に並べてみる。

tilt-jbuilder といわれる gem と padrino-jbuilder というまんまな名前の gem 、このふたつが今 Sinatra/Padrino でアプリケーションを作るときに使える jbuilder ライブラリになるみたい。

tilt-jbuilder

Gemfile に次の一行を加えることにより、 Controller で jbuilder というメソッドが使えるようになる。

gem "tilt-jbuilder", :require => "sinatra/jbuilder"

基本的に Sinatra なので、 Sinatra のルールに則って自由にテンプレートエンジンを追加できるらしい。デフォルトでは jbuilder メソッドが存在しないのでそれを追加してくれるらしい。

padrino-jbuilder

Gemfile に次の行を追加する。

gem 'multi_json'
gem 'padrino-jbuilder'

これは tilt-jbuilder よりシンプルで view file の最後を .jbuilder にすれば render メソッドを使うことによって自動的に jbuilder として処理してくれるというもの。 tilt-jbuilder のように jbuilder メソッドを追加してくれるものではないため、若干不自由。

違いとどちらがいいか

何も考えないでよければ個人的に padrino-jbuilder でいいかなという印象ですが、リクエストによって json か html かを動的に切り替えたいという場合には padrino-jbuilder では処理することができません。で、今回そのへん含めてどうなの?って調べていたので tilt-jbuilder の方がより便利という印象でした(あと、コードも綺麗な印象)。

メモ

明らかに Ruby (and Sinatra) に対する知識が足りないせいですが、 render メソッドの挙動が把握出来てなくて詰まった。
最初以下のようなコードを Controller に書いた。

# doesn't work
jbuilder 'event/join'

ひとしきり悩んで以下のような解決方法に辿り着いた。

# work fine! but, shitty code
jbuilder :join, views: "#{settings.views}/event"

だけどこれは流石に嘘だろうと思ったので、さらに2時間くらい Sinatra のコード追いかけたりした結果、ドキュメントに辿り着いた(なんで?)。

今までの苦労はなんだったんだという感じ。 Symbol で指定したときに綺麗に動くのはわかっていたんだけど、ファイルパスを含んでいる場合にどう書けばいいか知らなくて悩んだ。案外あっさりと解決できたのが悲しい。結局こう書けばいいんですね。

# alright! work fine!
jbuilder :'event/join'