在 Rails 4 中用于 JSON 处理的 jbuilder vs rails-api/active_model_serializers

Posted

技术标签:

【中文标题】在 Rails 4 中用于 JSON 处理的 jbuilder vs rails-api/active_model_serializers【英文标题】:jbuilder vs rails-api/active_model_serializers for JSON handling in Rails 4 【发布时间】:2014-11-23 16:59:39 【问题描述】:

我已经从Rails 4开始。

在处理 JSON 格式数据时,我发现我们可以使用 rails/jbuilder 并且效果很好。

但是,当我服用Codeschool's Rails 4 Pattern 时,他们提到了名为active_model_serializers 的宝石。

而对于active_model_serializers gem,JSON 序列化的所有逻辑都进入模型(这被认为是最佳实践)。

而对于jbuilder gem,我们需要编写扩展名为.json.jbuilder 的单独视图文件。

我的问题是:

哪一个最适合 JSON 数据处理 两者之间的任何性能差异

【问题讨论】:

使用 AMS,逻辑不进入模型 它进入“a”模型,而不是对象的模型。 【参考方案1】:

这取决于您的偏好和需求。

如果您正在使用 Ember.js 前端,我会倾向于 active_model_serializers,因为 Ember.js 基本上可以很好地与它配合使用(Yehuda Katz 是 active_model_serializers 的维护者之一,并且在Ember.js 的核心团队;he gave a talk 不久前讨论了这个话题)。

快速细分:

活动模型序列化器

将序列化问题分离到它自己的文件夹/app/serializers,带有它自己的 Rails 生成器,它的行为更像 ActiveRecord,因为您可以在序列化程序中定义关联。然后它会根据其自以为是的约定自动做正确的事情(例如骆驼外壳,侧装关联......等)。 Ryan Bates 有一个关于该主题的精彩 RailsCast 插曲:http://railscasts.com/episodes/409-active-model-serializers

Jbuilder

Jbuilder 采取了几乎相反的方法,因为它认为 JSON 格式构造只是 Rails 的另一个视图。您可以在相应的/app/views/ 目录中构建响应,就像使用视图模板一样。它可以具有视图模板的许多特征,例如了解 current_user 是什么、开箱即用(这在 AMS 中不那么直接)、链接关系 (@user.posts)...等等。当然,Ryan Bates 也就此主题进行了 RailsCast:http://railscasts.com/episodes/320-jbuilder

替代方案:Rabl

Ryan Bates(自然而然地)也在 Rabl 上制作了 RailsCast:http://railscasts.com/episodes/322-rabl。在概念上,它比 AMS 更接近 Jbuilder。而且它的存在时间也更长。我个人不是很喜欢它的语法。但这是一个见仁见智的问题。


如果我不是在从事 Ember.js 项目,我会选择 Jbuider,因为它的简单性和更平易近人的概念。

至于性能,至少有一位用户声称您可以使 Jbuilder 比 Rabl 和 AMS 快很多:https://medium.com/@lgmspb/how-we-increased-the-speed-of-json-generation-by-3000-times-ca9395ab7337


跟进(2015 年 1 月 22 日): Leigh Halliday 写了一个很好的速成课程,比较了一些宝石。除了此处提到的之外,本文还介绍了更多替代方案。 https://www.leighhalliday.com/responding-with-json-in-rails

【讨论】:

JBuilder 在其文档中提供了一些示例,其中在 ActiveRecord::Model 中构造了一个“builder”对象……但是,您不能使用任何 url 帮助程序。这可以追溯到 2013 年,当时 jbuilder 是 1.0。 有趣的是,另一篇博文发现 AMS 在某些情况下比 Jbuilder 快约 10 倍:kirillplatonov.com/2014/11/04/… 在个人使用中,我发现 AMS 在渲染内容方面更快,这是在开发盒上。 Jbuilder IMO 具有更大的灵活性,但需要大量编码才能运行。 AMS 的启动时间更快。我对 AMS 的主要问题是缺少 0.10.0rc4 的文档。引用的文档似乎适用于 0.9.0 并且尚未更新。 我完全同意“这取决于您的偏好和需求。”我已经写了一篇关于各种 JSON 序列化选项的更新评论,您可能会觉得它们很有帮助。 Which JSON Serializer To Use For A New Rails API?

以上是关于在 Rails 4 中用于 JSON 处理的 jbuilder vs rails-api/active_model_serializers的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4.2 强参数和解析 json put/update 上的更改属性

在 Rails 3 中处理 JS/ERB 模板中的 JSON

rails - 用于 json/xml 请求的 InvalidAuthenticityToken

在没有模型对象 Rails 4 中覆盖渲染:json

如何在rails中处理来自应用程序控制器的无效真实性令牌json请求

渲染 json 未显示在 rails 4 的视图中