Rails 4中处理JSON的Jbuilder与rails-api/active_model_serializers比较分析

38

我开始接触Rails 4。

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

然而,在学习Codeschool's Rails 4 Pattern时,他们提到了一个叫做active_model_serializers的gem。

对于active_model_serializers gem,所有的JSON序列化逻辑都放在Model中(被认为是最佳实践)。

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

我的问题是:

  • 哪一个更适合处理JSON数据
  • 两者之间是否有性能差异

2
使用AMS,逻辑不会进入模型。 - apneadiving
它进入了“a”模型,只是不是对象的模型。 - Greg Olsen
1个回答

58

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

如果您正在使用Ember.js前端,我会倾向于使用active_model_serializers,因为Ember.js基本上是为其良好配合而设计的(Yehuda Katz是active_model_serializers的维护者之一,并且是Ember.js核心团队的成员; 他曾经在一个主题上做过一个 演讲)。

快速概述:

Active Model Serializers

将序列化关注点分离到自己的文件夹/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项目,我会选择使用Jbuilder,因为它更简单易懂。
至于性能方面,至少有一个用户声称你可以使Jbuilder比Rabl和AMS都更快:https://medium.com/@lgmspb/how-we-increased-the-speed-of-json-generation-by-3000-times-ca9395ab7337 跟进(01/22/2015):Leigh Halliday撰写了一篇有关这些Gem的好文,对比了其中的一些内容。该文章还涵盖了几个其他替代方案。https://www.leighhalliday.com/responding-with-json-in-rails

1
JBuilder在其文档中有一些示例,其中在ActiveRecord :: Model内部构造了一个“builder”对象...但是您不能使用任何url helper。这可以追溯到2013年,当时jbuilder是1.0版本。 - Kurt Mueller
1
有趣的是,另一篇博客文章发现在某些情况下,AMS 比 Jbuilder 快大约 10 倍:https://kirillplatonov.com/2014/11/04/active_model_serializer_vs_jbuilder/ - Halil Özgür
在个人使用中,我发现AMS在渲染内容方面更快,这是在开发环境中。在我看来,Jbuilder更灵活,但需要大量编码才能运行。AMS的启动时间更快。我对AMS的主要问题是缺乏0.10.0rc4版本的文档。所引用的文档似乎是0.9.0版本的,并未更新。 - Tom T
2
我完全同意“这取决于您的偏好和需求。”我已经写了一篇更新的评论,介绍了各种JSON序列化选项,希望对您有所帮助。为新Rails API使用哪个JSON序列化器? - Carlos Ramirez III

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接