to_json rails 4 中的图像回形针中缺少域名

Domain name missing in image paperclip in to_json rails 4

我有像这样使用回形针的模型

has_attached_file :image, styles:  { :medium => "50x50>" }
validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/

def image_url
    image.url(:medium)
end

我需要它 Json,所以在我的控制器中,

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

结果是

"image_url":"/system/celebrities/images/000/000/003/medium/Designed___developed_by_wd_ApS.png?1430926991"

但是,我需要包括域名,localhost:3000, 所以我必须在这里做什么

解决方案 1:(使用现有代码)

您可以使用 ActionView::Helpers::AssetUrlHelper 模块中的 asset_url,这将为您提供图像的绝对 url。在你的模型中只需 include ActionView::Helpers::AssetUrlHelper 这个,这样 asset_url 就可以在你的模型中使用。 因此,您在模型中的方法将是:

include ActionView::Helpers::AssetUrlHelper

def image_url
   asset_url(image.url(:medium))
end

这是对您当前代码最简单的解决方案。

方案二:(控制器内部)

在您的控制器中 request 可用,因此您可以:

URI.join(request.url, @celebrity.image.url(:medium))

这将为您提供 image 的绝对值 url。这将是一个 URI 对象,可以使用 .to_s 方法将其转换为字符串。

这里是 issue from paperclip 这个解决方案的来源。希望这有帮助。

试试这个。

创建模块:

module WithDomain
  def domain
    @domain
  end

  def domain=(val)
    @domain = val
  end

  def domain?
    @domain.present?
  end
end

相应地更改模型:

class Celebtiry < ActiveRecord::Base
  include WithDomain

  # existing staff

  def image_url
    if domain?
      URI.join(domain, image.url(:medium)).to_s
     else
      image.url(:medium)
    end
  end
end

并在您的控制器中:

respond_to do |format|
  format.json {
    @celebrity.domain = request.base_url
    render json: @celebrity.to_json(:methods => [:image_url])
  }
end