使用 Jbuilder(或其他)的 Rails JSON API 布局

2024-04-24

在我的 Rails 3.2 应用程序中,我使用jbuilder https://github.com/rails/jbuilder呈现来自我的 JSON api 的响应。

我想为所有 API 响应提供一个通用的结构,而布局可能是保持视图干燥的解决方案。

例如:我希望每个回复都采用以下形式:

{
  status: "ok|error|redirect",
  data:   { ... JSON specific to the current view ... },
  errors: [ ... ],
  notes:  [ ... ]
}

(其中的值data是视图提供的json结构,其他一切都来自布局)

但是:我无法让 jbuilder 布局正确生成视图。

# in layout 
json.data yield

# in view
json.some "value"

结果是:

{"data":"{\"some\":\"value\"}"}  # arg! my json has become a string

尝试另一种方式:

# in layout 
yield

# in view
json.data do |json|
  json.some "value"
end

结果是 :

{}

有没有人使用 jbuilder 或其他 json 模板 gem/方法成功完成此操作?

This juilder github 问题 https://github.com/rails/jbuilder/issues/8表明这是可能的,但表明其他人也遇到类似的问题。

我看到 rabl (https://github.com/nesquena/rabl/)应该支持布局(https://github.com/nesquena/rabl/wiki/Using-Layouts),但我决定不使用出于其他原因(rabl 使复杂的 json 结构成为一场噩梦,特别是在尝试控制对象根等时)。


我将根据我们提出的解决方案为您提供替代方案:

# app/helpers/application_helper.rb
module ApplicationHelper
    def envelope(json, status, errors, notes)
        json.status status
        json.data do
            yield if block_given?
        end
        json.errors errors
        json.notes notes
    end
end

然后,在视图中,您可以调用信封并包含您的 json 代码,例如:

# app/views/api/v1/test/show.json.jbuilder
envelope(json, "OK" ) do
  json.some 'value'
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Jbuilder(或其他)的 Rails JSON API 布局 的相关文章

  • 如何让 Rails 资产管道生成源地图?

    我想让 Rails 与编译后的 CoffeeScript 缩小的 JS 一起生成源映射 以便更好地记录错误 不过 网上似乎还没有关于如何执行此操作的全面文档 有人这样做过吗 我使用 Rails 3 2 和 Heroku Rails 支持缩小
  • 返回没有属性名称的 Json 结果

    很可能是一个相当微不足道的问题 但我就是找不到合适的答案 我想返回一个 JsonResult 但实际结果没有任何属性名称 这是我想要实现的一个小例子 xbox Xbox 360 Xbox cheats Xbox 360 games The
  • 从 json 创建下拉列表

    我有一个这种形式的 json COLUMNS ID Name DATA 1 Joe 2 Sam 3 Doug 我正在寻找一个如何在 javascript 中从该数据创建下拉列表的示例 但 json dropdown 列表的所有示例 json
  • Facebook 注册后重定向至页面

    我正在尝试在成功 Facebook 注册 未登录 后重定向用户 我想重定向到 getstarted welcome用户注册后首次 我的omniauth回调是 def facebook You need to implement the me
  • 单表继承发现问题

    我有以下3个rails类 它们都存储在一张表中 使用rails的单表继承 class Template lt ActiveRecord Base class ThingTemplate lt Template class StockThin
  • ActiveAdmin 使用 Devise Rails 登录两次

    我有一个Rails已设置使用的应用程序devise with User模型 我只是添加ActiveAdmin并且它使用单独的型号名称AdminUser 这个新模型也使用了设计 我遇到的问题是 当我去localhost 3000 admin
  • 如何在 PHP 中替换/转义 U+2028 或 U+2029 字符以阻止我的 JSONP API 崩溃

    好的 我正在运行一个公共 JSONP API 数据由我的 PHP 服务器提供 我刚刚读了这篇文章 JSON 不是的 JavaScript 子集 作者 Magnus Holm 2011 年 5 月 http timelessrepo com
  • 如何在配置/初始化程序中使用 YML 值

    我正在努力将 Facebook 集成到我的应用程序中 为此 我使用 koala devise 和omniauth 对于考拉 我有 config facebook yml development app id 123123132123 sec
  • 定制导轨配置部分

    为 Rails 应用程序创建自定义配置部分的最佳方法是什么 理想情况下 我希望最终结果是一个 api 调用 例如 Rails configuration foo bar Rails configuration foo baz e g Rai
  • PHP:__toString() 和 json_encode() 不能很好地协同工作

    我遇到了一个奇怪的问题 我不知道如何解决它 我有几个类 它们都是 JSON 对象的 PHP 实现 这是问题的说明 class A protected a public function construct this gt a array n
  • 如何在 Groovy 中的 JSON Converter 方法中保留字母大小写?

    我正在尝试将 groovy 对象解析为 JSON 属性名称不遵循正确的驼峰式大小写形式 class Client String Name Date Birthdate 当我使用这个时 Client client new Client Nam
  • Rails - 使用delayed_job异步发送所有电子邮件

    我在用着延迟作业 https github com collectiveidea delayed job我对此非常满意 尤其是workless https github com lostboy workless扩大 但我想这样设置ALL我的
  • Rails 模型中的多个 counter_cache

    我正在学习 Rails 遇到了一个小问题 我正在编写带有任务列表的非常简单的应用程序 因此模型看起来像这样 class List lt ActiveRecord Base has many tasks has many undone tas
  • 使用 jQuery Mobile 和响应式布局/CSS 媒体查询是否多余?

    我正在退房http mediaqueri es http mediaqueri es 今天发现这些网站非常适合移动设备 所以我想知道将 jQuery Mobile 和响应 自适应布局与媒体查询一起使用是否是多余的 因为仅使用媒体查询似乎是一
  • Rails 应用程序中的持久 TCP 连接

    我有一个在服务器上运行的第三方应用程序 它对客户端进行身份验证并返回响应 我的问题是 对于我收到 Rails 应用程序的每个请求 我都需要建立 TCP 连接并获取数据 是否可以有一个持久连接 以便我可以减少建立连接的开销 我希望你使用的是
  • 通过 has_many 进行多个数据库连接

    如何通过使用多个数据库连接来创建 has many 我有一个名为 master 的数据库 其中保存位置信息 这是从单独的应用程序更新的 用户可以访问许多位置 但所有其他模型都位于另一个名为 budget 的数据库中 以下是模型的设置方式 p
  • Rails:从视图内渲染视图(不是部分视图)

    我有一个对两者都有响应的控制器html and js The htmlview 渲染整个页面 包括页眉和页脚 而js仅替换 main 除了页眉和页脚之外 两种格式呈现相同的内容 我可以用三个文件获得这种效果 show html erb di
  • blueprint/screen.css 未预编译

    我一直在遵循 Michael Hartl 出色的 RoR 教程 但我使用的是 RoR 3 1 我是 RoR 3 1 的新手 需要与资产管道相关的帮助 这是我的问题 在继续第 5 3 节之前 我想先转到 Heroku 看看事情如何发展 令我惊
  • angular.copy() 和 JSON.parse(JSON.stringify()) 之间的区别?

    有人可以解释 angular copy 和 JSON parse JSON stringify 之间的区别吗 有吗 您会推荐使用什么 angular fromJson angular toJson 与 JSON parse JSON str
  • Rails - 使链接与 ajax 一起工作

    我有一个链接 应该使用 ajax 加载它旁边的部分内容 而无需重新加载页面 链接在这里 这是链接应该转到的控制器 class ProfilesController lt ApplicationController def profile f

随机推荐

  • MongoDB聚合,按值区间分组,

    MongoDB 文档 id 123213 elevation 2300 area 25 id 343221 elevation 1600 area 35 id 545322 elevation 500 area 12 id 234234 e
  • 查找重复邮寄地址的策略

    我正在尝试想出一种根据相似度分数查找重复地址的方法 考虑这些重复的地址 addr 1 3 FAIRMONT LINK SOUTH addr 2 3 FAIRMONT LINK S addr 3 5703 48TH AVE adrr 4 57
  • 将标头添加到 WCF RequestSecurityToken 消息

    我正在尝试设置将使用 WSHttpBinding 进行通信的客户端 Web 应用程序 和服务 WCF 服务 看来 为了使用此绑定 客户端会发送初步消息来设置通道 客户端和服务之间存在一条服务总线 该总线在自定义标头上进行路由 当使用 Bas
  • 为什么 Glass 缺少 Google Play 服务?

    谷歌眼镜上不包含谷歌播放服务的原因是什么 将来会添加它们吗 看来将来还会在 Glass 上添加 Google Play 服务 有一个问题已被 接受 尽管具有中等优先级 请参阅来自谷歌眼镜官方发行网站
  • 如何从 node_modules 延迟加载外部模块?

    我们可以像这个模块一样延迟加载本地模块 path somePpath loadChildren app path some module SomeModule 我们如何延迟加载来自驻留在node modules中的外部库的模块 要在路由器模
  • 从 ASP 的 Ajax.ActionLink 获取 JsonResult

    如何使用 Ajax ActionLink 从控制器方法实际获取 JSON 我尝试搜索该网站 但我得到的最接近的是返回 JSON 或部分 html 的 ASP NET MVC 控制器操作 https stackoverflow com que
  • 如何从模数、指数和私有指数创建 Crypt::RSA 对象?

    我正在尝试将以下 php 功能移植到 perl public function loadKey mod exp type public rsa new Crypt RSA rsa gt signatureMode CRYPT RSA SIG
  • 如何在webRTC android中将视频流数据录制为mp4?

    请帮我 我在中使用了这个例子https github com pcab AndroidRTC https github com pchab AndroidRTC将视频和音频从 Android 设备流式传输到其他 Android 设备 在这个
  • Scipy Weibull CDF 计算

    我正在 Scipy 中进行生存计算 但无法获得正确的值 My code x a c 1000 1 5 5000 vals exponweib cdf x a c loc 0 scale 1 vals应该等于 0 08555935639278
  • Boost python 导出单例

    我有一个单例 来自 boost serialization class LogManager public boost serialization singleton
  • 将日期时间设置为下一刻钟

    让我们想象一下这个datetime gt gt gt import datetime gt gt gt dt datetime datetime 2012 10 25 17 32 16 我想把时间限制在下一刻钟 以便 datetime da
  • 使用 JMeter 时陷入嵌套循环。嵌套循环控制器和 CSV 数据集配置。

    在我的网站上 我有两个商家操作 搜索和浏览 一次搜索通常会触发三次浏览 我有一个 JMeter 测试 它使用商家和商家 ID 号的 CSV 文件 在大规模运行此测试时 我希望使用我网站上的所有商家 我已经在 J Meter 中映射了它 如下
  • 使用选项模式的依赖注入

    我正在尝试从 appsettings 文件加载一些设置 但在使用选项模式时加载列表的方式遇到了一个小问题 假设我有以下类 用于加载设置 public class Application public string Name get set
  • NUnit 不会因 Finalizer 中的异常而失败

    在我们的框架中 有一些具有文件句柄或 WCF 客户端连接的关键对象 这些对象是IDiposable我们有验证代码 抛出异常 以确保它们在不再需要时得到正确处置 仅调试 这样我们就不想在发布时崩溃 这不一定是在关机时发生的 最重要的是 我们有
  • Jersey Rest 客户端未添加查询参数

    我正在尝试为 google 搜索 api 制作一个简单的球衣休息客户端 Client client ClientBuilder newClient WebTarget target client target https www googl
  • Realm 为我的 apk 添加了额外的大小

    在添加 Realm 库之前 我的 apk 的初始大小为 2 3 MB 添加相同的库后 apk 大小增加到 10 61 MB 是否可以减小大小 如果是 如何减小 如果没有 请推荐 Realm 的替代品 您可以使用 abi split 来减小
  • 是否可以取消 NKAssetDownload?

    我在 App Store 上有一个杂志阅读器 我目前正在实现 NewsstandKit 功能 我的应用程序具有此下载工作流程 用户可以随时取消当前下载 我希望用户能够购买应用内产品 并以报刊亭后台下载的方式开始下载 杂志包含多媒体 因此它们
  • Java 中是否有“/usr/bin/strip”的对应项?

    有没有任何工具可以从 Java class 文件中删除调试信息 就像 usr bin strip可以在 Linux 上从 C C 目标文件中获取吗 EDIT 我喜欢 Thilo 和 Peter 的回答 Peter 的回答很简短 而且暴露了我
  • 在不兼容的接收器上调用方法 Set.prototype.add 未定义

    我根本不明白为什么它会给出这个错误 这是我在 chrome 控制台上测试的结果 gt var mySet lt undefined gt mySet new Set lt Set gt mySet add foo bar baz Worke
  • 使用 Jbuilder(或其他)的 Rails JSON API 布局

    在我的 Rails 3 2 应用程序中 我使用jbuilder https github com rails jbuilder呈现来自我的 JSON api 的响应 我想为所有 API 响应提供一个通用的结构 而布局可能是保持视图干燥的解决