我对Rails相当陌生,并且在我正在为当地高中开发的移动Web应用程序上取得稳步进展,但遇到了一个难以解决的问题。我希望这里的集体知识能够指引我走向正确的方向。上传文件参数不通过控制器
我有一个模型为学校运动员(名字,姓氏,身高,体重,毕业年限, - 标准的东西)正在工作(CRUD通过标准脚手架代),现在我想添加导入通过CSV上传记录。
为了不重复发明轮子,我遵循this example from Rich on Rails。为了熟悉它,我创建了一个单独的铁路项目,并遵循该示例,并且按预期工作。大。现在融入我现有的项目。
似乎一切都很好,但有一个例外 - CSV文件永远不会传递给我的模型的参数我无法弄清楚为什么。我相信这是明显的,但我已经盯着这个问题几个小时,并且无法看到我做错了什么。
这里是我的运动员控制器的一部分:
class AthletesController < ApplicationController
before_action :set_athlete, only: [:show, :edit, :update, :destroy]
# GET /athletes
# GET /athletes.json
def index
@athletes = Athlete.all.order(:lastname, :firstname)
end
# POST /athletes/import
# POST /athletes/import.json
def import
logger.info(params.to_yaml)
begin
Athlete.import(params[:file])
redirect_to page_path('admin'), notice: "Athletes imported."
rescue
redirect_to page_path('admin'), notice: "Invalid CSV file format."
end
end
# GET /athletes/1
# GET /athletes/1.json
def show
end
# GET /athletes/new
def new
@athlete = Athlete.new
end
# GET /athletes/1/edit
def edit
end
我的模型看起来是这样的:
class Athlete < ActiveRecord::Base
# an athlete can be on more than one team
has_and_belongs_to_many :teams, through: :athletes
require 'csv'
## CSV import
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
athlete_hash = row.to_hash # exclude the ? field
athlete = Athlete.where(id: athlete_hash["id"])
if athlete.count == 1
athlete.first.update_attributes
else
Athlete.create!(athlete_hash)
end # end if !athlete.nil?
end # end CSV.foreach
end # end self.import(file)
我已经添加到这个测试我的索引视图,以后这将是在管理员区域:
<div>
<h3>Import a CSV File</h3>
<%= form_tag import_athletes_path, multipart: true do %>
<%= file_field_tag :file %>
<%= submit_tag "Import CSV" %>
<% end %>
</div>
无论我做什么,我都不会得到的价值f ile_field_tag通过控制器。如果我使用text_field_tag添加其他字段,它们会按预期方式通过,但file_field_tag值永远不会。
--- !ruby/hash:ActionController::Parameters
utf8: "✓"
authenticity_token: it3yBxBnzA4UQ/NILP5GNoYJeO5dyg+Z+VfhE/C6p7k=
commit: Import CSV
action: import
controller: athletes
Redirected to http://localhost:3000/
Completed 302 Found in 8ms (ActiveRecord: 0.0ms)
我很难过 - 如果任何人有任何想法,我可能会做错什么,我将不胜感激。我有大约300名运动员,我想输入并且不想输入。
尝试在没有'begin ... rescue..end'块的情况下运行'import'动作,这里有99%的错误。 – 2014-09-02 15:03:23
我评论了开始/救援/结束,它没有任何区别 - 实际上,并不完全正确。由于:file参数未知,导致出现错误。现在我唯一玩的就是** logger.info(params.to_yaml)**来查看** params **中可用的内容,并且没有**文件**值。 – 2014-09-02 15:58:46
您的文件是否正确上传? – 2014-09-02 16:07:58