2017-12-28 51 views
0

私はCSVアップロードによっていくつかのリスティングをインポートするプロジェクトに取り組んでいます。レールアプリは、フロントエンドからCRUDアクションを実行できるようにします。次のようにRails:CSV一括アップロードのためのUploaderをバイパスする方法

リストクラスは次のとおりです。次のように

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 

しかし、バックエンドで、私はときに、画像霧画像のアップロードを回避しようとしていますURLは既にCSVファイルで提供されています。私は画像のアップローダーを実行したくありません。

私はCSVのアップロードに取り組んでいます。私はデータのハッシュとのリストを保存するとき、それは私にnilを与えるのURLに画像を設定しようとしていた場合

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 

:現時点では、コードは次のようになります。ただし、関数で使用されるデータHashには、test属性とlisting属性の結果として以下に示すimage属性があります。image属性も同様です。 enter image description here

私の主な質問は: はどうやって作成リストでアップローダーアクションをオーバーライドして、csvファイルで与えられたURL文字列に画像のURLを設定する/バイパスすることができます。 URLを設定していても設定されていなくてもリストは保存されています:image as nil。

答えて

0

自分自身で問題を解決しました。同様の問題に直面する可能性のある人のための回答。

私は与えられたURLから画像を取得するためにopen-uriを使用し、結果をループ内のリスト属性画像に割り当てました。

[: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.これは英雄の仕事でもあります。問題は今、CSVのアップロードがたくさんの質問をしていることと、英雄がアプリケーションエラーを出していることです。代わりにバッチクエリを使用する必要があります。

関連する問題