如何在to_json中获取Paperclip图像的URL

37

我有一个使用Paperclip的模型,代码如下:

has_attached_file :avatar, :styles => { :large => "100x100>" , :medium => "50x50>", :small => "20x20>" },  :default_url => '/images/missing-owner_:style.png'

我正在使用to_json方法导出此模型,并且希望导出图片URL以便在JavaScript中使用。

我知道我可以在视图中像这样访问URL:

<%= image_tag model.avatar.url(:medium) %>

但是我如何在to_json方法中实现相同的功能呢?

我的代码大致如下:

respond_to do |format|
   render :json => @model.to_json(:only => [:id,:name,:homephone,:cellphone])
end
2个回答

61

我认为你实现这个功能最简单的方法是在你的对象中创建一个方法来返回头像的URL。

class Model < ActiveRecord::Base
    ...

    def avatar_url
        avatar.url(:medium)
    end

    ...
end

这将使你能够使用methods选项在调用to_json时使用一个简单的方法,该方法不需要任何参数:

respond_to do |format|
   render :json => @model.to_json(:only => [:id,:name,:homephone,:cellphone], :methods => [:avatar_url])
end

这应该会产生如下输出:

{"id" => 1, "name" => "Cool model", "homephone" => 1234567890, "cellphone" => 0987654321, "avatar_url" => "www.coolsite.com/this_avatars_path"}

参考以下内容:

Ruby to_json:方法参数

http://apidock.com/rails/ActiveRecord/Serialization/to_json


2
示例表明avatar_url返回相对URL,而不是绝对URL。如果您需要绝对URL,请参考https://dev59.com/Z2cs5IYBdhLWcg3w0HSz#12556347。 - ciastek
这也适用于集合!(例如:@models.to_json(methods: [:example]) - collimarco
这写的也太多了吧?如果你需要在5个不同的模型上使用4种不同大小的图像,难道你需要为每个都写一个方法吗?它不能直接返回Paperclip所拥有的所有图像尺寸吗? - Vedmant
你可以像这样使用它来渲染所有的尺寸
def avatar_url [ medium: avatar.url(:medium), original: avatar.url ] end
- Astm

1
显示图像 JSON 的控制器

localhost:3000/cities/1.json

respond_to do |format|
  format.html
  format.json { render :json => @model.to_json(:methods => [:model_url]) }
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接