Ruby on rails File Upload -
today have little problem containing file upload.
first infos:
rubyversion: 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux] railsversion: rails 3.1.1
needed code: form
<%= form_for @label, :html => { :multipart => true } |f| %> <% if @label.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(@label.errors.count, "error") %> prohibited label being saved:</h2> <ul> <% @label.errors.full_messages.each |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 %>
my model:
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
my parser
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 |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
controller-log
# logfile created on 2012-06-06 09:49:23 +0200 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>
so! can see want upload csv-file parse database. copy of file should stored in folder called csv later use. i've done 5 times before , worked well, time seems, file-method in model isn't called. want work nothing more there changes catch errors , stuff in future ;). i've logged controller action, called every time. may logfile can you! me looks okay, comparing other logfiles. i've searched solution, looks okay me (maybe i've forgotten : or ,), can't what's wrong!
thanks help
i have solution!
i using rails 3.1.1 ruby 1.9.3 , it's gemset. problem new feature "attr_accessible". not used in rails 3.1.1 became necessary make :file-field accessible due newer gemset. solution simple, had add:
attr_accessible :file, ect
to top of model , worked fine!
Comments
Post a Comment