0

我们的业务要求是所有 JSON 响应看起来像这样:

{ "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 } 

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

应用程序/控制器/fruits_controller.rb

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

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

4

1 回答 1

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

渲染与路由对应的yieldHAML 模板,就像在普通的layouts/application.html.haml. 我相信你可以做类似的事情。

于 2013-06-12T08:54:09.703 回答