Mik*_*lsh 5 ruby csv upload ruby-on-rails ruby-on-rails-4
我对 Rails 相当陌生,并且一直在为我们当地的高中工作的移动 Web 应用程序上取得稳步进展,但遇到了一个让我难堪的问题。我希望这里的集体知识能够为我指明正确的方向。
我有一个正在工作的学校运动员模型(名字、姓氏、身高、体重、毕业年份, - 标准的东西)(通过标准脚手架生成 CRUD),现在我想添加通过 CSV 上传导入记录的功能.
为了不重新发明轮子,我正在关注Rich on Rails 中的这个示例。为了熟悉它,我创建了一个单独的 Rail 项目并按照示例进行操作,一切都按预期工作。伟大的。现在集成到我现有的项目中。
除了一个例外,一切似乎都很好地集成在一起 - CSV 文件从未在参数中传递给我的模型,我不知道为什么。我确信这是显而易见的,但我已经盯着这个问题几个小时了,但看不出我做错了什么。
这是我的 Athletes 控制器的一部分:
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
Run Code Online (Sandbox Code Playgroud)
我的模型看起来像这样:
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)
Run Code Online (Sandbox Code Playgroud)
我已将此添加到我的索引视图中进行测试,稍后它将在管理区域中:
<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>
Run Code Online (Sandbox Code Playgroud)
无论我做什么,我都无法将file_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)
Run Code Online (Sandbox Code Playgroud)
我很难过 - 如果有人对我可能做错了什么有任何想法,我将不胜感激。我有大约 300 名运动员,我想导入它们,但不想输入它们。
事实证明,因为我的框架使用 jQuery Mobile,所以我需要将“data-ajax=false”添加到我的表单标记中。对我的表单的更改允许文件参数在控制器中可见:
<h3>Import a CSV File</h3>
<%= form_tag(import_athletes_path, { :multipart => true, :'data-ajax' => false }) do %>
<%= file_field_tag :file %>
<%= submit_tag "Import CSV" %>
<% end %>
</div>
Run Code Online (Sandbox Code Playgroud)
不久前,我记得读过一些有关文件上传和 jQuery Mobile 默认情况下不工作的内容。这是由于 jQM 采用的标准 AJAX 导航。
| 归档时间: |
|
| 查看次数: |
915 次 |
| 最近记录: |