ROR 导入csv文件无方法错误
ROR import csv file no method error
错误:
NoMethodError (undefined method `read' for nil:NilClass):
app/controllers/imports_controller.rb:5:in `upload'
我根据之前的问题修改了我的 csv 上传程序 Adding CSV Import to a ROR application
我发现了一个几年前问过的问题,它看起来与我想要的相似,但其中一些代码是西班牙语 Ruby on Rails - Import CSV file
imports_controller:
class ImportsController < ApplicationController
def upload
logger.info "File loaded"
infile = params[:dump][:infile].read
n, errors = 0, []
@archive = []
CSV.parse(infile) do |row|
n += 1
# SKIP: header i.e. first row OR blank row
next if n == 1 or row.join.blank?
imports = Imports.build_from_csv(row)
if imports.valid?
imports.save
@archive << row
else
errors << row
end
end
logger.info errors
flash[:success] = "The CSV imported successfully"
respond_to do |format|
format.html # index.html.erb
format.json { render :json => @archive }
end
end
end
*请注意,似乎有额外的结尾,但在我添加它们之前,我遇到了应用程序错误
models/imports.rb:
class Imports < ActiveRecord::Base
def self.build_from_csv(row)
#last_level = (row[5].downcase == "yes"
imports = Imports.new(:imports => "#{row[0]}}",
:cart_items => "#{row[1].titlesize}",
:cart_items_quantity => "#{row[2].titlesize}",
:cart_items_price => "#{row[3].titlesize}",
:cart_items_description => "#{row[4].titlesize}",
:cart_items_upc => "#{row[5].titlesize}",
:cart_items_sku => "#{row[6].titlesize}")
# :last_level=> last_level)
return imports
end
end
这是我用来上传 csv 的表单调用:
<h3>Import CSV Order</h3>
<% form_for :dump, :url=>{:controller=>"imports", :action=>"upload"}, :html => { :multipart => true } do |f| -%>
<table">
<tr>
<td>
<label for="dump_file">
Select a CSV File :
</label>
</td>
<td >
<%= f.file_field :infile -%>
</td>
</tr>
<tr>
<td colspan='2'>
<%= submit_tag 'Submit' -%>
</td>
</tr>
</table>
因此,如果您对无方法错误有任何想法,我们将不胜感激。如您所知,我是 Ruby 的新手,这是一个继承的应用程序,因此非常欢迎任何帮助!
谢谢
是的,是 nil
。这不是您期望的地方。您的 form_for :dump
在语义上为对象 "dump" 构造了一个形式。它由相应键的 params
中的散列表示。所以,实际上,那个参数在那里:
params[:dump][:infile]
错误:
NoMethodError (undefined method `read' for nil:NilClass):
app/controllers/imports_controller.rb:5:in `upload'
我根据之前的问题修改了我的 csv 上传程序 Adding CSV Import to a ROR application
我发现了一个几年前问过的问题,它看起来与我想要的相似,但其中一些代码是西班牙语 Ruby on Rails - Import CSV file
imports_controller:
class ImportsController < ApplicationController
def upload
logger.info "File loaded"
infile = params[:dump][:infile].read
n, errors = 0, []
@archive = []
CSV.parse(infile) do |row|
n += 1
# SKIP: header i.e. first row OR blank row
next if n == 1 or row.join.blank?
imports = Imports.build_from_csv(row)
if imports.valid?
imports.save
@archive << row
else
errors << row
end
end
logger.info errors
flash[:success] = "The CSV imported successfully"
respond_to do |format|
format.html # index.html.erb
format.json { render :json => @archive }
end
end
end
*请注意,似乎有额外的结尾,但在我添加它们之前,我遇到了应用程序错误
models/imports.rb:
class Imports < ActiveRecord::Base
def self.build_from_csv(row)
#last_level = (row[5].downcase == "yes"
imports = Imports.new(:imports => "#{row[0]}}",
:cart_items => "#{row[1].titlesize}",
:cart_items_quantity => "#{row[2].titlesize}",
:cart_items_price => "#{row[3].titlesize}",
:cart_items_description => "#{row[4].titlesize}",
:cart_items_upc => "#{row[5].titlesize}",
:cart_items_sku => "#{row[6].titlesize}")
# :last_level=> last_level)
return imports
end
end
这是我用来上传 csv 的表单调用:
<h3>Import CSV Order</h3>
<% form_for :dump, :url=>{:controller=>"imports", :action=>"upload"}, :html => { :multipart => true } do |f| -%>
<table">
<tr>
<td>
<label for="dump_file">
Select a CSV File :
</label>
</td>
<td >
<%= f.file_field :infile -%>
</td>
</tr>
<tr>
<td colspan='2'>
<%= submit_tag 'Submit' -%>
</td>
</tr>
</table>
因此,如果您对无方法错误有任何想法,我们将不胜感激。如您所知,我是 Ruby 的新手,这是一个继承的应用程序,因此非常欢迎任何帮助! 谢谢
是的,是 nil
。这不是您期望的地方。您的 form_for :dump
在语义上为对象 "dump" 构造了一个形式。它由相应键的 params
中的散列表示。所以,实际上,那个参数在那里:
params[:dump][:infile]