我正在使用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
答案 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