Rails - JSON中的Paperclip url以及其他属性

时间:2012-12-11 05:31:46

标签: ruby-on-rails json

我跟随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) }

2 个答案:

答案 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