Ruby on rails 上传文件参数未通过控制器

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

我对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>