【问题标题】:include_root_in_json from controller来自控制器的 include_root_in_json
【发布时间】:2011-02-23 21:36:03
【问题描述】:

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

我不想在这个模型的所有动作上都设置这个,所以我尽量避免设置

ActiveRecord.Base.include_root_in_json = false

我希望我能做到

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

为了得到我需要的响应,但这似乎不起作用,返回一个 'undefined method include_root_in_json= for #

有什么好的方法吗??

【问题讨论】:

    标签: ruby-on-rails json


    【解决方案1】:

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

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

    my_model.to_json(:root => false)
    

    如果您不想包含根密钥。

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

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

    【讨论】:

    • 这显然是正确答案!不是那个有 5 票的人 :)
    【解决方案2】:

    从查看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 中包含根”选项在设计时并未考虑到这种级别的灵活性。它也可能导致与其他请求的竞争条件,但我不确定。或者,您可以始终将其设置为 false,并在需要时手动创建带有根键的哈希:

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

    【讨论】:

    • 谢谢吉米。你能解释一下'在调用之前更改类变量并在之后将其更改回来'是什么意思吗?我不确定我明白了。
    • 谁在他疯狂的脑海中想到了这个?!?!为什么不使用此设置向 to_json 添加一个选项?我有时不明白...
    • 确实荒谬。这会阻止使用 to_json 的任何代码的互操作性。莫名其妙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2013-08-11
    • 2020-12-22
    • 2013-09-08
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多