我正在学习如何导入csv文件。
我的csv文件名为stg_pound.csv,包含以下内容:
"FOREX RATES FOR DATES BETWEEN 2003-5-1 AND 2014-5-28, STG POUND",,,,
Date,Currency,Buy,Sell,Mean
01/01/03,STG POUND,147.5117,147.7939,147.653
01/02/03,STG POUND,147.837,148.1767,148.007
01/03/03,STG POUND,147.8006,148.1422,147.971
01/04/03,STG POUND,148.0311,148.3722,148.202
我的应用程序设置如下:
my forex index.html.erb:
<%= form_tag import_forexes_path, multipart: true do %>
<%= file_field_tag :file %>
<%= submit_tag "Import" %>
<% end %>
forexes_controller.rb
def import
Forex.import(params[:file])
redirect_to root_url, notice: "Imported"
end
forex.rb
# == Schema Information
#
# Table name: forexes
#
# id :integer not null, primary key
# published_at :datetime
# currency :string(255)
# buy :float
# sell :float
# mean :float
# created_at :datetime
# updated_at :datetime
#
def import
CSV.foreach(file.path, headers: true) do |row|
Forex.create! row.to_hash
end
end
routes.rb
resources :forexes do
collection { post :import}
end
application.rb
require 'csv'
当我尝试导入stg_pound.csv文件时,我得到以下错误:
undefined method `import' for #<Class:0xab2c6cc>
forex_controller。Rb文件高亮显示:
Forex.import(params[:file])
然而,我可以看到文件已被选中,因为在错误页面上我看到以下内容:
Request
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"mGm6jN7uvoRVjVbSDE/vpprIQnpjiL60s4rETHT9mPA=",
"file"=>#<ActionDispatch::Http::UploadedFile:0xaa974dc @tempfile=#<Tempfile:/tmp/RackMultipart20140530-4261-z8fb9x>,
@original_filename="stg_pound.csv",
@content_type="text/csv",
@headers="Content-Disposition: form-data; name="file"; filename="stg_pound.csv"rnContent-Type: text/csvrn">,
"commit"=>"Import"}
起初我认为这是因为:文件没有包含在strong_parameters中,所以我继续并在forex_controller强参数中包含以下内容,但它不起作用
def forex_params
params.require(:forex).permit(:published_at, :currency, :buy, :sell, :mean, :file)
end
首先,您的导入方法是一个实例,它需要是类。
def self.import
# content
end
其次,您从控制器Forex.import(params[:file])
向它传递参数,但没有捕获它们。
def self.import(file)
# content
end