2012-06-06 167 views
3

今天我有一个包含文件上传的小问题。Ruby on rails文件上传

首先,一些相关信息:

Rubyversion:1.9.3p194(2012-04-20修订35410)x86_64的Linux的] Railsversion:Rails的3.1.1

所需的代码: 我的形式

 <%= form_for @label, :html => { :multipart => true } do |f| %> 
      <% if @label.errors.any? %> 
        <div id="error_explanation"> 
          <h2><%= pluralize(@label.errors.count, "error") %> prohibited this label from being saved:</h2> 

          <ul> 
          <% @label.errors.full_messages.each do |msg| %> 
            <li><%= msg %></li> 
          <% end %> 
          </ul> 
        </div> 
      <% end %> 
      <div class="field"> 
        <%= f.label :file %><br /> 
        <%= f.file_field :file %> 
      </div> 
      <div class="actions"> 
        <%= f.submit %> 
      </div> 
    <% end %> 

我的模型:

class Label < ActiveRecord::Base 
    attr_accessor :file 
    attr_reader :file 

    def file=(file) 
      log = Logger.new(Rails.root.join("log/label.log").to_s) 
      log.info "file-Action called" 
      path=file.tempfile.to_path.to_s 
      filename="labellist.csv" 
      dest=Rails.root.join("app/assets/csv/").join(filename).to_s 
      FileUtils.cp(path, dest) 
      csv=CsvLabelParser.new 
      log.info "New Parser initialized!" 
      csv.parse_csv(dest) 
      log.info "Variables: path: #{path.inspect} <-----> dest: #{dest.inspect}" 
    end 
end 

我的解析器

class CsvLabelParser 
    require 'csv' 

    def initialize 
      @logger=Logger.new(Rails.root.join("log/parser.log").to_s) 
    end 

    def logger 
      @logger 
    end 

    def parse_csv(path) 
      counter = 0 
      read_handle = File.open(path, "rb") 
      content = read_handle.read 
      self.logger.info "CONTENT: #{content.inspect}" 
      read_handle.close 

      content.each_line do |line| 
        if counter != 0 
          csv_array=line.split(";") 
          self.logger.info "CSV-Array No. #{counter}: #{csv_array.inspect}" 
          label=Label.new 

          label.labnr=csv_array[10] 
          label.name=csv_array[0] 
          label.firm1=csv_array[3] 
          label.firm2=csv_array[4] 
          label.postal=csv_array[7] 
          label.city=csv_array[8] 
          label.country=csv_array[9] 
          label.street=csv_array[5] 
          label.pob=csv_array[6] 
          label.save 
        end 
        counter += 1 
      end 
    end 

end 

控制器,登录

# Logfile created on 2012-06-06 09:49:23 +0200 by logger.rb/31641 
Controller-create-method called! => variables: Params: {"utf8"=>"✓", "authenticity_token"=>"L+fpIMqFA9qe9U/LxU+atFONT8e3L5xEUum1321mRng=", "label"=>{"file"=>#<ActionDispatch::Http::UploadedFile:0x00000003df2318 @original_filename="ADRBW076-Q.csv", @content_type="text/csv", @headers="Content-Disposition: form-data; name=\"label[file]\"; filename=\"ADRBW076-Q.csv\"\r\nContent-Type: text/csv\r\n", @tempfile=#<File:/tmp/RackMultipart20120606-2741-1izzofa>>}, "commit"=>"Create Label", "action"=>"create", "controller"=>"labels"}<-----> Label: #<Label id: nil, labnr: nil, name: nil, firm1: nil, firm2: nil, postal: nil, city: nil, country: nil, street: nil, pob: nil, created_at: nil, updated_at: nil> 

所以!正如你所看到的,我想上传一个CSV文件来解析它到我的数据库中。文件的副本应存储在名为CSV的文件夹中供以后使用。我已经做了大约5次之前,它运作良好,但这次看起来,模型中的文件方法没有被调用。 现在我只希望它不再工作,将来会有一些变化来捕捉错误和类似的东西;)。 我记录了每次调用的Controller操作。日志文件可以帮助你!对我来说,它看起来没问题,将它与其他日志文件进行比较。 我已经寻找了解决方案,但一切看起来都对我好(也许我只是忘记了一个:或者一个),所以我不能真正说出有什么问题!

感谢您的帮助

+0

不知道你的代码有什么问题,但对于文件上传,我会建议像[CarrierWave](https://github.com/jnicklas/carrierwave)或[Paperclip](https:// github)这样的库。 COM/thoughtbot /回形针)。 – Stefan

回答

1

我有解决方案!

我使用Rails 3.1.1和Ruby 1.9.3,它是gemset。问题是新功能“attr_accessible”。通常不会在Rails 3.1.1中使用,由于更新的gemset,有必要使:file-Field可访问。所以解决方案很简单,我只需要添加:

attr_accessible :file, ect 

到我的模型的顶部,一切工作正常!