无法在轨道中显示远程图像

时间:2015-10-02 23:32:41

标签: ruby-on-rails ruby

我正在使用Carrier wave上传图片。但是使用image_uploader.rb文件中的默认store_dir,它会将store_dir附加到我的图像路径。所以我成功地显示了我上传的图像。但是,我有一个数据库,其中包含已存在的远程图像URL。这些远程图像网址不会显示,因为它会将store_dir附加到图像路径并且找不到它们。

例如: 这是" http://myapp.com/images/I/51oYEfb%2B0WL.SL160.jpg" as" /uploads/product/productimage/1/http%3A/myapp.com/images/I/51oYEfb%252B0WL。 SL160 .jpg &#34 ;

这是我的代码:

_product.html.erb

<% @products.each do |product| %>
  <li> 
    <%= image_tag(product.productimage_url) if product.productimage? %>
  </li>
<% end %>

Product.rb

class Product < ActiveRecord::Base
  mount_uploader :productimage, ProductimageUploader
end

productimage_uploader.rb

class ProductimageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  storage :file
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end

我甚至尝试了如下nil,它仍然附加/到图片网址:

def store_dir
  nil
end

1 个答案:

答案 0 :(得分:1)

我假设您必须已将远程网址加载到products'表格的productimage列中。

实现目标的最简单方法可能是将类似remote_url列的内容添加到products表中,而不是将远程URL放在productimage列中。然后你可以做类似的事情:

Class Product < ActiveRecord::Base
  def image_url
    productimage.present? ? productimage_url : remote_url
  end
end

然后将您的观点更改为:

<%= image_tag(product.image_url) if product.image_url.present? %>

如果你的products表已经使用了之前使用的其他东西来填充远程网址,那么可能更好的另一个选项就是编写一个rake任务来下载并使用carrierwave重新保存它们。这可能看起来像:

Product.all.each do |product|
  temp_location = Rails.root.join('tmp', File.basename(product.attributes['productimage']))
  uri = URI(product.attributes['productimage'])

  Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
    request = Net::HTTP::Get.new uri

    http.request request do |response|
      File.open(temp_location, 'w') do |file|
        response.read_body do |chunk|
          file.write chunk
        end
      end
    end
  end

  product.productimage = File.open(temp_location)
  product.save!

  File.unlink(temp_location)
end