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 在那个环境中被错误地覆盖了。

不过我还是不开心,因为我不能依赖渲染: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 尚未加载。因此设置为真。

ActiveRecord::Base您可以通过放入索引操作来强制它加载来测试该理论。

于 2012-10-31T15:15:41.650 回答
1

我正在寻找以下配置:

ActiveRecord::Base.include_root_in_json

它会产生您在对象的 JSON 表示之间获得的差异:如果设置为 true,则将对象名称添加为生成的 JSON 的根键。

于 2012-10-31T15:07:38.893 回答
0

我如何在应用程序运行时准确地找出应用程序中需要哪些 gem?

Gemfile.lock文件指定了这一点。

于 2017-09-19T14:32:09.980 回答