Rails:如何绕过上传器进行CSV批量上传

时间:2017-12-28 00:32:35

标签: ruby-on-rails csv file-upload carrierwave image-uploading

我正在开展一个项目,我想通过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属性。 enter image description here

我的主要问题是: 如何在列表创建中绕过/覆盖上传器操作,并将图像URL设置为csv文件中给出的url字符串。即使我设置的URL未设置且列表正在保存:image为nil。

1 个答案:

答案 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正在发出应用程序错误。我不得不改为使用批量查询。