Ruby to_json方法包括方法,即使被要求不这样做

时间:2010-08-15 00:06:29

标签: ruby-on-rails ruby

我正在使用to_json,包括协会。 但是,生成的json对象包含关联对象的所有方法,即使我要求它排除方法。

我尝试过这些方法:

render :json => @entries.to_json(:include => {:labels => {:only => [:label_id, :name], :methods => []}})
render :json => @entries.to_json(:include => {:labels => {:only => [:label_id, :name], :methods => :none}})
render :json => @entries.to_json(:methods => [], :include => {:labels => {:only => [:label_id, :name], :methods => []}})

我得到以下对象:

"entry": {
    "id" : "1",
    "other property of entry" : "value",
    ...
    "labels" : {
        "0" : {
            "name" : "animals",
            "label_id" : "2",
        },
        "1" : {
            "name" : "furry animals",
            "label_id" : "5",
        },
        "_each" : "... method properties",
        "_reverse" "... method properties",
        etc...
     }
}

因此,正确创建了“entry”的每个json对象,包含了相关的标签,但我无法忽略“标签”中的方法。

有关如何正确执行此操作的任何想法?

感谢。


修改

@nirvdrum,谢谢你的建议。 不幸的是,这并没有解决它。

我已将此添加到模型中

def as_json(options={})
  super(:include => {:labels => {:only => [:label_id, :name]} } )
end

控制器执行此操作:

render :json => @entries

结果是一样的。 任何其他建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

我不知道如何使用to_json,但你应该能够使用as_json轻松完成,现在这是自定义JSON输出的首选方法。

可以在Jonathan Julian's weblog上找到有关as_json和to_json如何互动的更全面的处理方法。

答案 1 :(得分:0)

你的标签对象的to_json或as_json是什么样的?

过去,我已经覆盖了一个as_json方法,并忽略了进来的选项。

如果你这样做:

def as_json(opts={})
  super(:include=>[:name, :address])
end

那么params将完全被忽略。要解决这个问题,你可以:

def as_json(opts={})
  opts.merge!(:include=>[:name, :address])
  super(opts)
end

在黑暗中拍摄。如果那就是在附近,请告诉我。