我跟随Ryan Bates'screencast使用jQuery Tokeninput作为多对多关联的自动完成列表。现在我想为每个结果提取一张照片。我正在使用Paperclip并通过在控制器中执行此操作将url传递到JSON文件中:
format.json { render :json => @users.map(&:photo_url) }
Ryan将属性传递到JSON文件的代码是:
format.json { render :json => @users.map(&:attributes) }
但是如何将两者合并以显示JSON文件中的:attributes
和:photo_url
方法?
我尝试了不同的东西,包括下面的代码,但似乎没有任何效果。好像只能在.map
上调用一个方法?
// Doesn't work
format.json { render :json => @users.map(&:attributes, &:photo_url) }
// Doesn't work
format.json { render :json => @users.map(&:attributes).map(&:photo_url) }
答案 0 :(得分:2)
这有帮助吗? (注意 - 我只是从一个晚上回来而不是100%,所以我可能会完全误解你的问题。)
这将创建一个数组数组:数组中的第一个元素包含用户的属性,第二个元素包含照片URL:
@users.map {|u| [u.attributes, u.photo_url]}
这会创建一个哈希 - 就像上面的数组一样。但第一个元素被命名为“attributes”,第二个元素被命名为“photo_url”。
@users.map {|u| {:attributes => u.attributes, :photo_url => u.photo_url}}
尝试插入其中一个或两个。它们应该适合你。
(例如format.json { render :json => @users.map {|u| [u.attributes, u.photo_url]} }
)。
编辑:
刚才有了另一个想法。
您可以将两者合并为一个集合(这样您就可以将它们全部放在一个哈希中,而不是数组中的单独元素):
@users.map {|u| u.attributes.merge(:photo_url => u.photo_url)}
这将photo_url
添加为attributes
哈希的键。对于您编写的用于阅读JSON的代码,它可能更容易工作。
答案 1 :(得分:0)
如果这对任何人都有帮助,我会找到一个很好的方法来做到这一点:
class MyModel < ActiveRecord::Base
has_attached_file :avatar, :styles => { :large => "500x500#", :medium => "300x300#", :small => "100x100#", :thumb => "50x50#" }
def as_json(options)
json = super
self.avatar.styles.each do | format |
json = json.merge({"avatar_"+format[0].to_s => self.avatar(format[0])})
end
json
end
end
然后您可以直接致电
render :json => @my_model
在渲染集合时也可以使用。
然后可以使用as_json(options)进行一些条件渲染,例如:
model_to_json = @my_model.to_json(:nested => true)
render :json => model_json