Ruby on rails 上传文件参数未通过控制器
我对Rails还相当陌生,一直在为当地高中开发一款移动Web应用程序,但遇到了一个让我感到困惑的问题。我希望这里的集体知识将为我指明正确的方向 我有一个学校运动员的模型(名字、姓氏、身高、体重、毕业年限、标准材料),它正在工作(CRUD通过标准脚手架生成),现在我想添加通过CSV上传导入记录的功能 为了避免重蹈覆辙,我也在追随。为了熟悉它,我创建了一个单独的Rail项目,并遵循该示例,所有这些都按照预期工作。伟大的现在,将其集成到我现有的项目中 除了一个例外,一切似乎都很好地集成在一起——CSV文件从未在参数中传递给我的模型,我不知道为什么。我确信这是显而易见的,但我已经盯着这个问题看了好几个小时,看不出我做错了什么 以下是我的运动员控制器的一部分:Ruby on rails 上传文件参数未通过控制器,ruby-on-rails,ruby,csv,ruby-on-rails-4,upload,Ruby On Rails,Ruby,Csv,Ruby On Rails 4,Upload,我对Rails还相当陌生,一直在为当地高中开发一款移动Web应用程序,但遇到了一个让我感到困惑的问题。我希望这里的集体知识将为我指明正确的方向 我有一个学校运动员的模型(名字、姓氏、身高、体重、毕业年限、标准材料),它正在工作(CRUD通过标准脚手架生成),现在我想添加通过CSV上传导入记录的功能 为了避免重蹈覆辙,我也在追随。为了熟悉它,我创建了一个单独的Rail项目,并遵循该示例,所有这些都按照预期工作。伟大的现在,将其集成到我现有的项目中 除了一个例外,一切似乎都很好地集成在一起——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
<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>
我被难住了——如果有人知道我可能做错了什么,我将不胜感激。我想导入大约300名运动员,但不想输入他们。事实证明,因为我的框架使用jQuery Mobile,所以我需要在表单标记中添加“data ajax=false”。对我的表单的此更改允许文件参数在控制器中可见:
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
<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>
导入CSV文件
true,:'data-ajax'=>false})do%>
不久前,我记得读过一些关于文件上传和jQuery Mobile默认不工作的文章。这是由于jQM采用了标准的AJAX导航 尝试运行
import
action而不使用begin…rescue..end
block,这里99%的错误。我注释掉了begin/rescue/end,它没有任何区别-实际上,不完全正确。我有一个错误,因为:file参数未知。现在我唯一能做的就是使用logger.info(params.to_yaml)来查看params中的可用内容,并且没有文件值。您的文件是否已正确上载?否-我希望看到以下内容:{“utf8”=>”✓","真实性令牌“=>”mGm6jN7uvoRVjVbSDE/vpprIQnpjiL60s4rETHT9mPA=“,”文件“=>”,“提交”=>“导入”}正如我在最初的问题中所指出的,参数转储不包含“文件”字段。您使用什么宝石来保存文件回形针或carrierwave
<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>