我正在开展一个项目,我想通过CSV上传导入一些列表。 rails应用程序允许人们从前端执行CRUD操作。
Listing类如下:
class Listing < ActiveRecord::Base
mount_uploader :image, ImageUploader
end
上传者类如下:
# encoding: utf-8
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :fog
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
#Create different versions of your uploaded files:
version :thumb do
process :resize_to_fit => [200, 200]
end
end
但是在后端,当我在CSV文件中提供了图片网址时,我正试图绕过图片上传到雾。我不想为图片运行上传器。
我正在处理CSV上传。目前,代码如下:
def self.import(file)
count = 0
CSV.foreach(file, headers: true, encoding:'iso-8859-1:utf-8') do |row|
data = {}
row.to_hash.each do |k, v|
key = MAP[k]
data[key] = v
end
unless data[:vin] == nil
listing = Listing.find_by_vin(data[:vin]) || Listing.new
#listing.attributes = (row.to_hash).merge(image: URI.parse(row['image'])) #
listing.title = "#{data[:year]} #{data[:make]} #{data[:model]}"
unless data[:all_images] == nil
listing_images = data[:all_images].split(",")
i = 0
[:image, :imagefront, :imageback, :imageleft, :imageright, :frontinterior, :rearinterior].each do |image|
unless listing_images.size < 1
data[image] = listing_images[i]
i += 1
end
p "hello"
end
end
data.delete(:all_images)
p data
listing.attributes = data
if listing.valid?
if listing.save!
count = count+1
end
end
end
end
return count
end
当我尝试将图像设置为网址时,在使用数据哈希保存列表时,它会给我nil。但是,函数中使用的数据哈希确实具有:image属性,如下所示,作为测试和列表的结果,还具有:image属性。
我的主要问题是: 如何在列表创建中绕过/覆盖上传器操作,并将图像URL设置为csv文件中给出的url字符串。即使我设置的URL未设置且列表正在保存:image为nil。
答案 0 :(得分:0)
自己解决了这个问题。回答那些可能面临类似问题的人。
我使用open-uri从给定的URL获取图像,然后将结果分配给循环中的列表属性图像。
[:image, :imagefront, :imageback, :imageleft, :imageright, :frontinterior, :rearinterior].each do |image|
unless listing_images.size < 1
data[image] = CsvUploading::picture_from_url(listing_images[i])
i += 1
end
end
将模块中的函数picture_from_url分开,以便我可以在其他类中再次使用它。
require "open-uri"
module CsvUploading
def self.picture_from_url(url)
open(url)
end
end
P.S。这也是关于heroku的工作。现在的问题是CSV上传正在进行大量查询,而heroku正在发出应用程序错误。我不得不改为使用批量查询。