我想将一个Place对象数组转换为json,我一直这样做:
var places = <%= @places.to_json.html_safe %>;
唯一的问题是@places数组中的每个位置都有一个未包含的关联标记列表。我正在使用acts_as_taggable_on gem来处理标签,所以要获取一个地方的标签列表,我需要说place.tag_list。
我需要做些什么来为javascript数组中的每个位置包含tag_list?我想我需要编写自己的to_json方法,但我不知道如何。
修改
事实证明,这比我意识到的要容易。我能够这样说:
var places = <%= @places.to_json(:include => :tags).html_safe %>
唯一的问题是,这包含有关每个标签的更多信息,而不是我真正需要的。每个标签都有一个id和名称,我真正想要的只是一个带有标签名称的列表。
答案 0 :(得分:5)
to_json
方法也接受名为methods
的参数。此参数允许您指定应调用并包含在对象的json表示中的方法。既然您提到了一个名为tag_list
的方法,那么您可以这样做:
var places = <%= @places.to_json(:methods => :tag_list).html_safe %>
如果由于某种原因,您没有生成标记名称的方法,但每个标记都有一个方法可以为您提供名称,您可以在Place
模型中添加一个方法来生成一个列表标签名称如下:
def tag_names
tags.collect do |tag|
tag.name
end
end
然后你可以像tag_names
那样得到你的地方json:
place_json = @places.to_json(:methods => :tag_names)
此技术适用于您要添加到模型的json表示的任何计算属性。
答案 1 :(得分:2)
在Place类中,您可以覆盖to_json。在Rails 3中,你应该改写as_json:
def as_json (options={})
# add whatever fields you need here
end
然后将您的代码更改为:
var places = <%= @places.as_json.html_safe %>;
答案 2 :(得分:1)
如果你打电话,Benson的回答将不起作用
render :json => @places
PlacesController中的。您需要在Place模型中添加以下代码。
# this method is called on a single instance
def to_json(options={})
options[:methods] ||= []
options[:methods] << :tag_names
super(options)
end
# this method is called for each instance in an Array to avoid circular references.
def as_json(options={})
options[:methods] ||= []
options[:methods] << :tag_names
super(options)
end
希望能帮到别人。我必须查看源代码,找出Array.to_json
与Array.each { |a| a.to_json }
不一样的原因
答案 3 :(得分:0)