RailsでJSONを返却するAPIを作成する時のあれこれ


Rails json api

先月作ってたアプリのノートの残骸を漁ってたら、結構JSONフォーマットで返却する時に一人でハマってた事が多かったので今更ですがPOSTしておこう( ´∀`)


目標

RailsでJSONデータを返却する場合、基本的には
render :json => @foo
で一発で終わりますが今回やりたかったのはテンプルを好き勝手にカスタマイズしたいという事です。

たとえば、モデルインスタンスの中身全部をjsonで返却したくなかったり、複数の変数を混ぜてJSONで返したりしたい時とかとか。

jBuilderを使う事にした

あ、ちなみに今更ですがRails3.2での話です。
Rails4系だとjBuilderがデフォで入ってるんじゃなかったけか。

3系の場合は gemfileの jbuilderのコメントアウトをはずして
bundle install

JSON出力へのrender

view側で必要なアクション名+.json.builder とした名前のファイルを用意しコントローラから呼ぶ。
けど、なぜか render “index.json.builder” のように指定したら動いたものの、logに以下のようなwarningが出力された。

DEPRECATION WARNING:Passing a template handler in the template nameis deprecated.You can simply remove the handler name or pass render:handlers =>[:jbuilder] instead.

だ、だりぃなぁ(*_*;

ちゃんと書く場合は以下の様子。


def index
  @user = User.find(params[:id])
  render "index", :formats => [:json], :handlers => [:jbuilder]
end

出力するJSONの整形

app/view/XXX/index.json.jbuilderの中身を作成していく

基本系が、
json.key “value”
の格好。

例)
json.name "users"
json.count @users.count
↓
{
  "name":"users"
  "count":"10"
}

配列とか

keyをjson.set! で指定し、valueをブロックで追加していく。

json.set! :user_info do
  json.array! @users do |user|
    json.id user.id
    json.name user.name
    json.mailaddrr user.mailaddrr
  end
end

こんな感じで非常に楽ですなぁ。

なお、jsonに空の配列を入れないといけない時があって、ちょっと苦労した。
どうやら力技に近いが

json.set! :hogehoge do
  json.array! do
  end
end

↑これでいけた。 まぁ、言われてみれば確かに。。(*_*;

vimでjbuilderのsyntaxもあてておきたい

デフォルトでbuilderの拡張子が用意されていましたが、なぜか今回jbuilderの拡張子じゃないと怒られて動かなかった。
このあたりは後日調べるとして、とりあえずvimmerなのでjbuilder拡張子にsyntaxをあてたい。

filetype.vim を開かないとならんのですが、全然わからんかったので locateコマンドで探してしまいました(;・∀・)

自分のバージョンのvimだとだいたい1600行目にruby関連の拡張子設定がいたので、ここに*.jbuilderを追加して完了。

"Ruby on Rails
au BufNewFile,BufRead *.jbuilder,*.builder,*.rxml,*.rjs setf ruby

おわり(´∀`*)

2014-04-20 | Posted in RailsNo Comments » 


関連記事

Comment





Comment



*