2012-04-19 15 views
0

FasterCSVを使用してタブ区切りファイルをインポートしようとしています。私は様々なことを試して、さまざまなエラーを得る。現在の状態で私は "未定義のメソッドの一時ファイル"エラーが発生しています。FasterCSV/Rails 3.1/Ruby 1.8.7を使用してインポート

作成アクションにfastercsvコードを追加しました。一括インポートはデータがこのモデルに追加される唯一の方法です。

ここに私のコードです。誰でも助けてくれますか?どんな援助も本当に感謝しています!

マイモデル:

class AppleSale < ActiveRecord::Base 
end 

マイコントローラー:

require 'fastercsv' 
require 'tempfile' 

class AppleSalesController < ApplicationController 

    def new 
    @apple_sale = AppleSale.new 
    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render :json => @apple_sale } 
    end 
    end 

def create 
    file = params[:tsv_file] 
    FasterCSV.new(file.tempfile, {:headers => true, :quote_char=>'"', :col_sep =>"\t"}) do |row_data| 

     new_record = AppleSale.first_or_new(
      'provider' => row_data['provider'], 
      'provider_country' => row_data['provider_country'], 
      'vendor_identifier' => row_data['vendor_identifier'], 
      'upc' => row_data['upc'], 
      'isrc' => row_data['isrc'], 
      'artist_show' => row_data['artist_show'], 
      'title' => row_data['title'], 
      'label_studio_network' => row_data['label_studio_network'], 
      'product_type_identifier' => row_data['product_type_identifier'], 
      'units' => row_data['units'], 
      'royalty_price' => row_data['royalty_price'],      
      'download_date' => row_data['download_date'], 
      'order_id' => row_data['order_id'], 
      'postal_code' => row_data['postal_code'], 
      'customer_identifier' => row_data['customer_identifier'], 
      'report_date' => row_data['report_date'], 
      'sale_return' => row_data['sale_return'], 
      'customer_currency' => row_data['customer_currency'], 
      'country_code' => row_data['country_code'], 
      'royalty_currency' => row_data['royalty_currency'], 
      'preorder' => row_data['preorder'], 
      'isan' => row_data['isan'], 
      'customer_price' => row_data['customer_price'], 
      'apple_identifier' => row_data['apple_identifier'], 
      'cma' => row_data['cma'], 
      'asset_content_flavor' => row_data['asset_content_flavor'], 
      'vendor_order_code' => row_data['vendor_order_code'], 
      'grid' => row_data['grid'], 
      'promo_code' => row_data['promo_code'], 
      'parent_identifier' => row_data['parent_identifier'], 
      'apple_identifier' => row_data['apple_identifier']     
     ) 
     new_record.save 
    end 
    end 
end 

マイフォームビュー:

<%= form_for(@apple_sale, :multipart => true) do |f| -%> 
<%= f.file_field :tsv_file %> 
<%= f.submit "Upload >>", :class => "submit" %> 
<% end %> 

マイGemfileが含まれています

gem 'fastercsv' 

ありがとうございます! THISを必要とするかもしれない他の人のため

UPDATEが、私はまだ自分の質問に答えることができない:それはすべてのコントローラには、次のように変更されていた

。これは完全に機能するようです。

def create 
    uploaded_io = params[:apple_sale][:tsv_file] 
    File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file| 
    file.write(uploaded_io.read) 
    end 

    FasterCSV.foreach(uploaded_io.original_filename, {:headers => true, :col_sep =>"\t"}) do |row_data| 

     new_record = AppleSale.new(
      'provider' => row_data[0], 
      'provider_country' => row_data[1], 
      'vendor_identifier' => row_data[2], 
      'upc' => row_data[3], 
      'isrc' => row_data[4], 
      'artist_show' => row_data[5], 
      'title' => row_data[6], 
      'label_studio_network' => row_data[7], 
      'product_type_identifier' => row_data[8], 
      'units' => row_data[9], 
      'royalty_price' => row_data[10],      
      'download_date' => row_data[11], 
      'order_id' => row_data[12], 
      'postal_code' => row_data[13], 
      'customer_identifier' => row_data[14], 
      'report_date' => row_data[15], 
      'sale_return' => row_data[16], 
      'customer_currency' => row_data[17], 
      'country_code' => row_data[18], 
      'royalty_currency' => row_data[19], 
      'preorder' => row_data[20], 
      'isan' => row_data[21], 
      'customer_price' => row_data[22], 
      'apple_identifier' => row_data[23], 
      'cma' => row_data[24], 
      'asset_content_flavor' => row_data[25], 
      'vendor_order_code' => row_data[26], 
      'grid' => row_data[27], 
      'promo_code' => row_data[28], 
      'parent_identifier' => row_data[29] 

     ) 
     new_record.save 
    end 

     respond_to do |format| 
      format.html { redirect_to apple_sales_path, :notice => "Successfully imported sales." } 
     end 

    end 
+0

また、これまでより良いアプローチを提案すること自由に感じなさいもしあなたがそれを知っていれば。 – Raoot

答えて

0

:私はFasterCSVがnewでブロックを受け入れるとは思いません。

:Railsの3.1のドキュメントによると - あなたは、ファイルアップロードフォームの実装時:
http://guides.rubyonrails.org/form_helpers.html#uploading-files

を...結果paramは必ずしもプレーンファイルないIOオブジェクトです

ので、私はこのような何かがそれをやるべきだと思うparseIOオブジェクト+ブロックを受け入れるように見えるFasterCSVソース、 を見る:

FasterCSV.parse(file, ...) do |row_data| 
    ... 
end 
+0

あなたはポイント1について正しいと思います。私はそれをforeachに変更し、TSVファイルでハードコードしています。これはデータを挿入しますが、最初の3つのフィールドのみを挿入し、1000行で切り捨てます。私はあなたが提案したものを試しましたが、コントローラはフォームで使用されているファイルを見つけることができないようです.....私はそれをfastercsvに渡す前にどこかにアップロードする必要がありますか?もしできれば、私はそれをしなくてもいいです。 – Raoot

+0

@RyanBerry RoRガイドに投稿したリンクを見てください。それは正確にそれを行う方法を説明します。また、レールロガーを使用してアプリケーションをデバッグして、何が起こっているのかを知る必要があります:http://guides.rubyonrails.org/debugging_rails_applications.html。 – Casper

関連する問題