0

我已经关注了 Ryan Bates 的关于使用 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) }
4

2 回答 2

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 而编写的任何代码,它可能更容易工作。

于 2012-12-11T06:27:15.033 回答
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  
于 2014-02-12T11:12:32.480 回答