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

时间:2014-09-02 14:55:22

标签: ruby-on-rails ruby csv ruby-on-rails-4 upload

我对Rails相当新,并且我正在为我们当地的高中工作的移动网络应用程序取得稳步进展,但遇到了一个我难以接受的问题。我希望这里的集体知识能指引我走向正确的方向。

我有一个学校运动员的模型(名字,姓氏,身高,体重,毕业年份, - 标准的东西)正在运作(通过标准脚手架生成CRUD)现在我想添加导入记录的能力通过CSV上传。

为了不重新发明轮子,我正在关注this example from Rich on Rails。为了熟悉它,我创建了一个单独的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

我的模型看起来像这样:

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>

无论我做什么,我都无法获得 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)

我很难过 - 如果有人对我可能做错了什么有任何想法,我将不胜感激。我有大约300名运动员,我想进口并且不想输入它们。

1 个答案:

答案 0 :(得分:0)

事实证明,因为我正在为我的框架使用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>

不久前,我回想起有关文件上传的内容,jQuery Mobile默认情况下无法正常工作。这是由于jQM采用的标准AJAX导航。