2013-06-12 19 views
0

我們的業務要求是所有JSON響應看起來像這樣一致的JSON對象:如何使用Rabl的延伸和/諧音產生跨模型

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

換句話說,響應的肉一組「記錄」,但它需要用狀態,分頁屬性等來包裝。我想用RABL來生成它。有沒有一種方法可以使用擴展或部分以乾的方式在我的所有對象上構建此結構?

我很樂意做這樣的事情:

應用程序/視圖/部件/ 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-IFY另一個對象,我可以這樣做:

應用程序/視圖/水果/ index.rabl

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

應用程序/控制器/ fruits_controller。 rb

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

而且,不需要修改layouts/base,顯然。

回答

2

您應該可以使用JSON佈局,就像您使用HTML佈局一樣。我不知道你如何使用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中那樣。我相信你可以做類似的事情。

+0

我很樂意使用「純」RABL解決方案,但這很好,因爲我可以在以後重構它。謝謝。我將暫緩接受這一點作爲答案。 – xrd

+1

啊哈 - 我遇到了這個答案,並認爲「我的代碼看起來非常熟悉」。必須有一位偉大的作家;) –