我正在尝试将结果返回到json不包含根的视图。
我不想在此模型的所有操作上设置此项,因此我尝试避免设置
ActiveRecord.Base.include_root_in_json = false
我希望我能做到
@task = Tasks.all @task.include_root_in_json = false
要获得我需要的响应,但这似乎不起作用,返回'未定义的方法include_root_in_json = for#
有没有一种很好的方法呢?
答案 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 }