来自控制器的include_root_in_json

时间:2011-02-23 21:36:03

标签: ruby-on-rails json

我正在尝试将结果返回到json不包含根的视图。

我不想在此模型的所有操作上设置此项,因此我尝试避免设置

ActiveRecord.Base.include_root_in_json = false

我希望我能做到

@task = Tasks.all
@task.include_root_in_json = false

要获得我需要的响应,但这似乎不起作用,返回'未定义的方法include_root_in_json = for#

有没有一种很好的方法呢?

2 个答案:

答案 0 :(得分:12)

现在这是一个老问题,但答案没有更新, Rails 3.2填补了空白Rails source

使用Rails 3.2,您现在可以使用:

my_model.to_json(:root => false)

如果您不想包含根密钥。

我刚刚用数组测试它会变得更好,所以你可以这样做:

Model.all.to_json(:root => true)

答案 1 :(得分:5)

通过查看ActiveModel::Serializers::JSON#as_json的来源,似乎无法在每个方法调用的基础上更改include_root_in_json的值。除非我遗漏了某些内容,否则最好的办法是在通话前更改课程变量,然后再将其更改:

ActiveRecord::Base.include_root_in_json = false
render :json => @task
ActiveRecord::Base.include_root_in_json = true

这非常难看,但似乎“在json中包含root”选项并没有考虑到这种灵活性。它也可能导致其他请求的竞争条件,但我不确定。或者,您可以始终将其设置为false,并在需要的情况下手动创建带有根密钥的哈希:

# this case
render :json => @task

# some other case
render :json => { :my_model => @my_model.to_json }