Active Model Serializer 更符合 DRY 原则一些;
Rabl, jBuilder 更容易理解和编写,直接和 views 写在同一文件夹下。
#3 楼 @saiga rabl 我尝试过很不好用,很诡异的 API(上一次用是两年前,现在全然忘记了需要重新学习)。as_json 可以更让接口更面向 RESTful 设计,没有思维切换过程。
ruby
format.json { render :json => {:topic => @topic, :replies => @topic.replies}, :status => 200}
里面对应的 topic 和 reply 的 JSON 格式在各自的 model 里定义就可以了,重载或覆盖。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: {} }