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

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

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

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

共收到 12 条回复

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楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册