1

Rails アプリで奇妙な動作が見られます。Ruby 1.9.2-p290 を実行しており、次のようなコントローラーを使用しています。

class NumbersController < ApplicationController

  def index
    render :json => [1,2,3]
  end

end

問題を示すために、次のようにサーバーを実行するとします。

$ rails s # This one runs in "development" on port 3000
$ RAILS_ENV=production rails s -p 2999 # This one runs in "production" on port 2999

開発モードまたはテストモードでは、私の結果は次のようになります

$ curl localhost:3000/numbers # development
{numbers: [1,2,3]} # The root is being included in the json, as inferred from the controller name.
$ curl localhost:2999/numbers # production
[1,2,3] # No root in the JSON

私は細かい歯のくしでアプリを調べましたが、開発と本番の間でjsonに影響を与えるように見える明らかな構成の違いはありません. また、「if Rails.env === 'production'」のような行はありません

render :json => ... の動作を変更しているアセットなど、さまざまな宝石が必要であると推測しています。実行中のアプリ内から "json" および "multi_json" gem のバージョンを調べましたが、それらは同じです (それぞれ 1.7.5 と 1.3.6 で、multi_json は同じアダプターを使用しています)。アプリの実行中に必要な gem をアプリ内から正確に知るにはどうすればよいですか? また、誰か別の説明がありますか?

編集: Rails 3.1.1 を実行しており、Gemfile のアセット部分は次のとおりです。

group :assets do
  gem "ember-rails"
  gem "jquery-rails"
  gem "less", "2.0.7"
  gem "less-rails", "2.0.2"
  gem 'uglifier'
end
4

4 に答える 4

3

ここで回避策を見つけました:コントローラーからの include_root_in_json

ソリューション:

render :json => {:numbers => [1,2,3]}, :root => false # If you want the root

:root => true は本番環境では尊重されていません。その環境で as_json または to_json が誤ってオーバーライドされたと思われます。

render :json => [1, 2, 3] に頼ることができないので、私はまだ満足していません。

于 2012-10-31T22:40:25.470 に答える
2

この動作は、新しい Rails アプリの config/initializers/wrap_parameters.rb のこの設定によって制御されます。

# Disable root element in JSON by default.
ActiveSupport.on_load(:active_record) do
  self.include_root_in_json = false
end

コントローラーが AR (ActiveRecord) クラスを参照していないため、開発モードでの遅延読み込みのために AR がまだ読み込まれていない可能性があります。したがって、設定は true です。

ActiveRecord::Baseindex アクションを挿入して強制的にロードすることで、その理論をテストできます。

于 2012-10-31T15:15:41.650 に答える
1

次の構成を探しています。

ActiveRecord::Base.include_root_in_json

オブジェクトの JSON 表現間で得られる違いを正確に生成します。true に設定すると、生成された JSON のルート キーとしてオブジェクト名が追加されます。

于 2012-10-31T15:07:38.893 に答える