【问题标题】:How can I use RABL and extends/partials to generate a consistent JSON object across models如何使用 RABL 和 extends/partials 跨模型生成一致的 JSON 对象
【发布时间】:2013-06-12 06:28:14
【问题描述】:

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

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

换句话说,响应的主体是一组“记录”,但它需要用状态、分页属性等进行包装。我想使用 RABL 来生成它。有没有办法使用 extends 或 partial 以 DRY 方式在我的所有对象中构建这个结构?

我很想做这样的事情:

app/views/widgets/index.rabl

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

app/views/layouts/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 化另一个对象,我可以这样做:

app/views/fruits/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

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

【问题讨论】:

    标签: ruby-on-rails json rabl


    【解决方案1】:

    您应该能够使用 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 中一样。我相信你可以做类似的事情。

    【讨论】:

    • 我很想使用“纯”RABL 解决方案,但这很好,因为我可以稍后对其进行重构。谢谢你。我暂时不会接受这个作为答案。
    • 啊哈-我遇到了这个答案并认为“我的代码看起来非常熟悉”。必须有一位伟大的作者;)
    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多