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

时间:2015-09-05 04:15:39

标签: ruby-on-rails ruby-on-rails-3 ruby-on-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, 所以我必须在这做什么

2 个答案:

答案 0 :(得分:1)

试试这个。

创建模块:

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

答案 1 :(得分:0)

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

您可以使用ActionView::Helpers::AssetUrlHelper模块中的asset_url,它会为您提供图片的绝对网址。只需在模型中include ActionView::Helpers::AssetUrlHelper这样,即可在模型中使用asset_url。 因此,模型中的方法是:

include ActionView::Helpers::AssetUrlHelper

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

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

解决方案2 :(在控制器内部)

在你的控制器中request可用,所以你可以这样做:

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

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

以下是导出此解决方案的issue from paperclip。希望这会有所帮助。