JavaScript 重写 Json Presenter,是用 rabl, jbuilder 这一类好,还是 AMS 这一类好

kevinhua · 2013年04月25日 · 最后由 hooopo 回复于 2013年07月22日 · 4916 次阅读

Active Model Serializer 更符合 DRY 原则一些;

Rabl, jBuilder 更容易理解和编写,直接和 views 写在同一文件夹下。

jBuilder

我觉得 Rails 自带的 as_json 很不错了。有问题的话,那很大程度上是数据库没设计好。

#2 楼 @mvj3 富客户端应用那个很明显不怎么好用...View 都是空的,代码全挤到 controller 里面了。 Active Model Serializer 独立于 controller 和 view,单独放在 serializers 里,不过对于复杂的 json 结构个人感觉不怎么好用,好处是不会混在一起,而且好像可以和 Ember-data 无缝结合。 JBuilder 没用过,所以个人比较推荐 rabl

#3 楼 @saiga rabl 我尝试过很不好用,很诡异的 API(上一次用是两年前,现在全然忘记了需要重新学习)。as_json 可以更让接口更面向 RESTful 设计,没有思维切换过程。

  1. 输出一个 show 或 index 没问题
  2. 输出组合的 json,比如 ruby format.json { render :json => {:topic => @topic, :replies => @topic.replies}, :status => 200} 里面对应的 topic 和 reply 的 JSON 格式在各自的 model 里定义就可以了,重载或覆盖。
  3. 甚至返回一段渲染的 HTML 也可以 ruby format.json { render :json => {:topics => @topics, :paginate_html => @paginate_html}, :status => 200}

Active Model Serializer 也是可以做的,而且层次更清晰。另外,对于公共逻辑 AMS 处理起来很简洁的,比如分页,我这么做就行了:

class PaginationSerializer < HasharraySerializer
  def as_json(*args)
    array= super(*args)
    hash = @options[:hash]
    hash.merge!(results: array, pagination: pagination)
    hash
  end

  def pagination
    hash = {}
    hash[:current_page] = object.current_page
    hash[:first_page] = object.first_page?
    hash[:last_page] = object.last_page?
    hash
  end
end
class DocumentSerializer < ActiveModel::Serializer
  attributes :id, :content, :title, :is_public, :shared_id, :created_at, :group_id, :deleted_at
end
render json: @documents, serializer: PaginationSerializer

出来的 json => { result: [docs...], pagination: {} }

jbuilder 内置在 Rails4 里面了,其余我也就不说啥了,大家懂的…

Jbuilder 还行昂。

容我想想

#5 楼 @saiga 不可否认 Active Model Serializer 分割的更细致,而在我的方法里只需要维护原来的 MVC 三个层次即可,扩展的只是在 M 里多配置 as_json 一个方法。

我举的分页的例子其实是说明返回一段 HTML 是如何便利,这个在 MVC Single Page Application 特别有用,比如 js 里没有 kaminari 那么好用的分页模块,在 Rails 的 Controller 里 render_to_string 渲染后整合到返回 JSON 数据里,也特别符合 Rails 默认 MVC 的约定逻辑。

Rabl 比 jBuilder 效率高~

11 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号