Gem jbuilder vs active_model_serializers

ericguo · 发布于 2016年12月26日 · 最后由 easonlovewan 回复于 2017年1月11日 · 1303 次阅读
1665
共收到 31 条回复
3
lgn21st · #1 · 2016年12月26日 4 个赞

把这两个作为关键词去 Google 能搜到大量的讨论,以及对比文章,背后的区别无非是理念上的差别,或者从不同的角度看待 JSON 生成这个事情。

jBuilder 把 JSON 视作 view 层的东西,构建复杂的 JSON 对象的时候,可以在适当的时候引入 Presenter 模式/对象。
AMS 把 JSON 视作 model 层的东西,复杂的对象生成可能会用到 Service 模式/对象。

All in all, 无论哪种方式,都是代码组织协调层面的事情,关乎设计,风格,而非技术。

p.s. API Only 模式的 Rails 应用,因为没有 View 层,所以顺理成章的选择 AMS 咯。

2
huacnlee · #2 · 2016年12月27日 1 个赞

jbuilder 是 Rails 官方维护的,还有 DHH 参与,Basecamp 也在用,改用它能更快接上 Rails 最新版本

4933
realwol · #4 · 2016年12月27日 3 个赞

推崇主厨精选的思路我也赞同,不过我用过一点grape,个人感觉grape在实现api server的时候,确实有很多比较好的实践,比如他的api请求参数限制方式;grape entity的封装 复用,挺灵活,值得学习。 不知道jbuilder和 AMS 在同一种对象,不同输出格式的情景里,是不是能做到grape entity的这种方式。

2
huacnlee · #5 · 2016年12月27日 1 个赞

其实在我看来 active_modal_serializer 和 jbuilder 都没什么大问题,只是各自表现方式不同,但 jbuilder 能随着 Rails 组的管理获得更快的新版本支持,为何不用呢?

当然 jbuilder 我也是第一次用,不知道会不会有其他的问题,只是目前看起来没什么明显的问题,也挺好用的,从 active_modal_serializer 已有的代码重构也几下就弄好了。

哦,jbuilder 内建类似 ActionView 那种 fragment_cache 的哦,这点用起来很舒服。

而 active_modal_serializer 的 cache 写法到现在我还没搞太明白,好像是有点小问题没搞透

10351
liukun_lk · #6 · 2016年12月27日

#5楼 @huacnlee 现在看 AMS 的文档,它的 cache 似乎还是有点问题的。

27
numbcoder · #7 · 2016年12月27日 2 个赞

active_modal_serializer 我每次都是边用边吐槽,感觉维护也很乱

用 jbuilder 的话,我建议可以试一下 jb

1665
ericguo · #8 · 2016年12月29日

#7楼 @numbcoder ams的维护 bf4非常勤勉,实际上远远超出了jbuilder的几位维护者。。

370
kgen · #9 · 2016年12月29日

jbuilder 在 Rails 兼容性方面安心很多,毕竟是亲儿子

1
Rei · #11 · 2016年12月30日

#8楼 @ericguo 抽象增加要做的工作就多。

17671
easonlovewan · #12 · 2016年12月30日

用过jbuilder也用过grape现在正在用直接用controller做api,不过直观感受是以前用jbuilder做API,随着版本的升级业务的扩展,文件变得越来越多,难以维护(可能是因为能力问题)

1665
ericguo · #13 · 2016年12月30日

#11楼 @Rei 这篇文章我看过,从gem作者的角度,这样说一点问题没有,但是如果从web应用开发者角度,我认为,有现成的gem,质量过得去还是要用,啥都自己造轮子何必要用Rails呢?。。。

1
Rei · #14 · 2016年12月30日

#13楼 @ericguo 如果只做 ping 服务器,确实没必要用 Rails。Rails 自带了构建 web 应用的很多组件,如果满足需求,就没必要增加依赖。

换个组件增加抽象的愉快感很可能是短期的,长期看就是维护和沟通成本的负担。

1665
ericguo · #15 · 2017年1月09日

#3楼 @huacnlee active_modal_serializer 0.10.4已经不依赖于json了,不管1.8还是2.0

2
huacnlee · #16 · 2017年1月09日

#15楼 @ericguo 太慢了,我都重构完了

483
davidwei · #17 · 2017年1月09日

@realwol 同意。Grape 自带参数的 validator,用起来比较省心,而且作为 API 的话,比较方便地描述参数的限制,对客户端开发者来讲也是很赞的。

ActionController::API 还是没有类似 Grape 的参数 validator 和 声明机制,不晓得 @huacnlee 平时是如何使用的? 目前看 rails-api 没有对此支持的计划:https://github.com/rails-api/rails-api/issues/216

2880
luikore · #18 · 2017年1月10日

觉得 jb 更好, 那些 dsl 没必要...

4375
saiga · #19 · 2017年1月10日

#7楼 @numbcoder 如果只是单纯输出json,不依赖gem直接用rails的json.ruby模板就行了。。

# views/**/*.json.ruby
obj = {
  title: @post.title
}
if user.admin?
  obj[:admin] = true
end
obj.to_json
# *_controller.rb
render json: render_to_string('**/*.json.ruby'), content_type: 'application/json'
2
huacnlee · #20 · 2017年1月10日 1 个赞

#19楼 @saiga Real World 里面不是这么简单的,关联数据(甚至几层的情况)需要 cache 的

4375
saiga · #21 · 2017年1月10日

#20楼 @huacnlee 是的,所以我加上只考虑单纯输出json,因为和jb的写法太像了😂

17004
matrixbirds · #22 · 2017年1月10日

美学前端肛了之后 以后再也不敢用ams..

2880
luikore · #23 · 2017年1月11日

#20楼 @huacnlee 缓存 cache(...) { ... } 就好了, 也不关模板的事

2
huacnlee · #24 · 2017年1月11日

#23楼 @luikore 有一些细节的,例如 Views Digest,自己搞是可以,但最后都从头实现了

另外上次回复的时候我没注意看,原来 #19楼 @saiga 是写的 *.json.ruby 的模版文件,这样其实也差不多和 jbuilder 一样了

17671
easonlovewan · #25 · 2017年1月11日

最近在尝试一种新方案:重写as_json的 json_options,根据业务需求去自定义它的json结构如下:

self.json_options = {
    only: [:xxx],
    methods: [:xxx],
    include: {
      xxx: {......}
    }
  }

然后controller层index如下:

render json: {users: @users.as_json}

如果特殊的接口可能需要自定义一些json格式

class_attribute :show_json_option
self.show_json_options = {
    only: [:xxx],
    methods: [:xxx],
    include: {
      xxx: {......}
    }
  }

然后controller层index如下:

render json: @user.as_json(User.show_json_option)

把重model发挥到极致😂

2
huacnlee · #26 · 2017年1月11日
17671
easonlovewan · #27 · 2017年1月11日

#26楼 @huacnlee 有什么想法?

2
huacnlee · #28 · 2017年1月11日
17671
easonlovewan · #29 · 2017年1月11日

#28楼 @huacnlee 还好吧,每个model基本只定义了index_json和show_json,目前没有遇到维护上的难题😅

2746
hbin · #30 · 2017年1月11日

#29楼 @easonlovewan 比如 API 1.0 和 API 2.0 结构大调整怎么办,jbuilder 远比 其他方案简单清晰的多

17671
easonlovewan · #31 · 2017年1月11日

#30楼 @hbin 目前考虑的只能在原有的基础上进行改动

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册