コレクション要素の配列を含む単一のルート要素を持つ JSON オブジェクトにシリアル化する ActiveRecords のコレクションを取得するにはどうすればよいですか?
Rails 3.0.10 から Rails 3.2 にアップグレードしたばかりで、ActiveRecord オブジェクトのコレクションを JSON にシリアル化する方法で問題が発生しました。
私はいくつかの読書を行い、私たちto_json
のやり方を使用することはおそらく悪い考えであることを知っています。すぐに修正する予定ですが、暫定的に、コードを修正するための可能な限り最速の方法を探しています。これらの変更により API が壊れていたため、以前に行ったこと。
次のコードを使用して、JSON として "index" アクションで返されていた Form 型の ActiveRecord オブジェクトのコレクションがあります。
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)
前もって感謝します!これは奇妙なものです。