我们的业务要求是所有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
而且,显然不需要修改布局/基础。
答案 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
中一样。我相信你可以做类似的事情。