2011-02-25 7 views
0

他の優れた答えは同様の投稿にもかかわらず、私はこのエラーを生成している私のコードのエラーを見ることができません: "未定義のメソッド` parse_file 'for ... " 私はRoR(Rails 2.1) FasterCSVプラグインを使用してCSVファイルをアップロードして解析しようとしています。私はまた、ファイルのファイル名のレコードをアップロードテーブルに保存しています。任意の助けRORの「メソッドが見つかりません」というエラーはなぜですか?

多くのおかげで(これは私にナットを運転している...):

私のモデル:

require 'fastercsv' 

    def new 

    @upload = Upload.new 

    end 

    def self.parse_file(file)  

    FasterCSV.foreach(file.path,:headers=>"first_row", :col_sep=>"\t") do |row| 
     row.each{|row| puts "row: #{row.inspect}"} 
    end 

    end 

私のコントローラ:

def create 

    @upload = Upload.new  
    thefile = params[:upload][:upload_file] 
    @upload.filename = base_part_of(thefile.original_filename) 
    @upload.parse_file(thefile) 

    respond_to do |format| 
     if @upload.save 
     flash[:notice] = 'Upload was successful.' 
     format.html { redirect_to(@upload) } 
     format.xml { render :xml => @upload, :status => :created, :location => @upload } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @upload.errors, :status => :unprocessable_entity } 
     end 
    end 

    end 


    def base_part_of(file_name) 
     File.basename(file_name) 
    end 

私の見解:

<% form_for(:upload, 
      :url => {:action=> :create}, 
      :html => { :multipart => true}) do |form| %> 

    Upload your file: <%= form.file_field("upload_file",:size=>50,:class => "csv-input") %><br/> 

    <%= submit_tag("Upload") %> 

<% end %> 

(部分)スタックトレースエラーの:

vendor/rails/activerecord/lib/active_record/attribute_methods.rb:256:in `method_missing' 
vendor/rails/actionpack/lib/action_controller/base.rb:1162:in `send' 
vendor/rails/actionpack/lib/action_controller/base.rb:1162:in `perform_action_without_filters' 
vendor/rails/actionpack/lib/action_controller/filters.rb:580:in `call_filters' 
vendor/rails/actionpack/lib/action_controller/filters.rb:573:in `perform_action_without_benchmark' 
vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' 
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure' 
vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' 
vendor/rails/actionpack/lib/action_controller/rescue.rb:201:in `perform_action_without_caching' 
vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:13:in `perform_action' 
vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:33:in `cache' 
vendor/rails/activerecord/lib/active_record/query_cache.rb:8:in `cache' 
vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:12:in `perform_action' 
vendor/rails/actionpack/lib/action_controller/base.rb:529:in `send' 
vendor/rails/actionpack/lib/action_controller/base.rb:529:in `process_without_filters' 
vendor/rails/actionpack/lib/action_controller/filters.rb:569:in `process_without_session_management_support' 
vendor/rails/actionpack/lib/action_controller/session_management.rb:130:in `process' 
vendor/rails/actionpack/lib/action_controller/base.rb:389:in `process' 
... 

答えて

4

あなたは、インスタンス(@upload)上のクラスメソッド(Upload.parse_file)を呼んでいます。あなたの定義を変更するか:

class Upload 
    def parse_file(file) 
    FasterCSV.foreach(file.path,:headers=>"first_row", :col_sep=>"\t") do |row| 
     row.each{|row| puts "row: #{row.inspect}"} 
    end 
    end 
end 

またはお電話変更:

Upload.parse_file(thefile) 
関連する問題