如何使用RABL和extends / partials在模型之间生成一致的JSON对象

时间:2013-06-12 06:28:15

标签: ruby-on-rails json rabl

我们的业务要求是所有JSON响应都是这样的:

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

换句话说,响应的内容是“记录”的集合,但它需要包含状态,分页属性等。我想使用RABL来生成它。有没有办法使用extends或partial来以干燥的方式在我的所有对象上构建这个结构?

我喜欢做这样的事情:

应用/视图/窗口小部件/ 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 } 

应用/控制器/ 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

而且,显然不需要修改布局/基础。

1 个答案:

答案 0 :(得分:2)

您应该可以使用JSON布局,就像使用HTML格式一样。我不确定你会yield如何使用RABL,但你可能会做类似的事情。当我们收到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中一样。我相信你可以做类似的事情。