0

如何获取 ActiveRecords 的集合以序列化为具有单个根元素的 JSON 对象,该根元素包含 colletions 元素的数组?

我们刚刚从 Rails 3.0.10 升级到 Rails 3.2,在将 ActiveRecord 对象的集合序列化为 JSON 的方式上遇到了问题。

我已经阅读并知道使用to_json我们现在的方式可能是一个坏主意,我们会尽快解决这个问题,但在此期间,我正在寻找可能修复我的代码的最快方法,所以它确实由于这些更改破坏了我们的 API,它之前做了什么。

我们有一个 Form 类型的 ActiveRecord 对象集合,这些对象在“索引”操作中作为 JSON 使用以下代码返回:

def index # in our FormsController

  # get our "records" collection from the database

  respond_to do |format|
    yield(format) if block_given?

    # other formats excluded for simplicity

    format.json {
      records = records.call if records.is_a?(Proc)
      render :json => records.to_json(serialize_records_options), :layout => false
    }
  end
end

# These are in ApplicationController

def serialize_options
  (self.class.serialize_options if self.class.respond_to? :serialize_options) || {}
end

def serialize_records_options
  options = serialize_options.clone
  options[:root] = (options[:root].pluralize if options[:root]) || controller_name
  options[:indent] ||= 2
  options
end

问题是这曾经序列化为:

{
    "total_entries": 2,
    "total_pages": 1,
    "forms": [{
        "form": {
            ... attributes ...
        }
    },
    {
        "form": {
            ... attributes ...
        }
    }],
    "per_page": 5,
    "current_page": 1
}

现在序列化为:

[{
  "forms": { 
    ... attributes of form 1 ... 
  }
},
{
  "forms": { 
    ... attributes of form 2 ... 
  }
},
{
... more forms ...
}]

我们的客户端应用程序甚至无法将该格式识别为有效的 JSON 对象。关于我们如何让它以原始格式输出的任何想法?除了升级 Rails 及其依赖项外,我们没有更改任何序列化代码。我们的包中有以下 JSON gem:

$ bundle show | grep json
  * json (1.7.3)
  * jsonpath (0.5.0)
  * multi_json (1.3.5)

提前致谢!这是一个奇怪的问题。

4

0 回答 0