0

私たちのビジネス要件は、すべての JSON 応答が次のようになることです。

{ "status": "ok"
"page": "1",
"perPage: "20",
"totalPages": "3",
"totalRecords": "54",
"records": [ { "id": 1234, "name": "Lorem ipsum } ] } 

言い換えれば、応答の要は「レコード」のセットですが、ステータス、ページング属性などでラップする必要があります。RABL を使用してこれを生成したいと思います。拡張またはパーシャルを使用して、すべてのオブジェクトにわたってこの構造を DRY 方法で構築する方法はありますか?

私はこのようなことをしたいと思います:

アプリ/ビュー/ウィジェット/index.rabl

collection @widgets, :object_root => false
attributes :id, :name
extends "layouts/base" , :locals => { results: @widgets }

アプリ/ビュー/レイアウト/base.rabl

node( :status ) { 'ok' }
node( :pages ) { @results.total_pages } 

app/controllers/widgets_controller.rb

def index
  @widgets = Widget.paginate( page: params[:page] )
end

これはそのままでは機能しません。

明確にするために、ローカルを @results として設定し、ラッパー内で使用できるようにします。

次に、別のオブジェクトを JSON 化する場合は、次のようにします。

アプリ/ビュー/フルーツ/index.rabl

collection @fruits, :object_root => false
attributes :id, :flavor
extends "layouts/base" , :locals => { results: @fruits }

app/controllers/fruits_controller.rb

def index
  @fruits = Fruit.paginate( page: params[:page] )
end

そして、明らかに、レイアウト/ベースを変更する必要はありません。

4

1 に答える 1

2

HTML に使用するのと同じように、JSON レイアウトを使用できるはずです。RABL をどのようにyield使用するかはわかりませんが、おそらく同様のことができます。JSON リクエストを受け取ると、いくつかのメタデータと、ページに挿入する HTML のブロックで応答するため、次のようになります。

layouts/application.json.haml:

!= {  js_to_eval: @tracking.flush_mp_js + @tracking.flush_ga_js, 
      flash: flash_to_raw_json,
      html: yield }.to_json

は、通常のyieldと同様に、ルートに対応する HAML テンプレートをレンダリングしますlayouts/application.html.haml。似たようなことができると確信しています。

于 2013-06-12T08:54:09.703 に答える