Rails需要一个JSON Builder

说过要写tutorials的,我却发现自己写的东西越来越中国化了,就是很装逼却没实际价值,高手不屑一看,新手看不懂的境界。

于是,我决定以后写的詳細一点。不过在我如此混乱的文字组织下,可能就找不到重点了

我有很多的events,想返回JSON格式,只需要这样写

class EventsController < ApplicationController
  respond_to :json

  def index
    respond_with(@events)
  end
end

Rails很智能,它会自动的使用@events.to_json来返回JSON,大部分时间这就是我想要的,可现在问题出现了。。。

我不喜欢默认的这个JSON,比如我需要给这个JSON加一个值"total":69。如果是XML格式,Rails提供了Builder,可我没找到比较方便的JSON Builder

针对现在小小的需求,可以这样做

respond_with(@events) do |format|
  format.json {
    events_hash = Hash.from_xml(@events.to_xml).merge('total' => 69)
    render :json => ActiveSupport::JSON.encode(events_hash), :layout => false
  }
end

如果你需要的JSON格式很非主流呢?没关系,你已经注意到上面使用的Hash.from_xml了,于是我们使用XML Builder来构建一个XML

xml.instruct!
xml.events do
  @events.each do |event|
    xml.event { xml.name event.name }
  end
end

现在一个超级简约的JSON就要构建完毕了

events_hash = Hash.from_xml(render_to_string(:template => 'events/index.xml.builder', :layout => false))

嗯,就这样

2 COMMENTS >>LEAVE<<

  1. Firm

    俺是新新手还是看不懂

  2. kevinyang1981

    这是我的解决办法, 基于你的方法, 有些不同

    class ActiveRecord::Base


    # so we can do something like
    # user[:books] = user.books
    # user.to_json2 will have books data
    def to_json2
    h = Hash.from_xml(self.to_xml)
    h.to_json
    end

    end

LEAVE A RESPONSE >>CANCEL<<

loader