2014-09-02 44 views
3

我对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名运动员,我想输入并且不想输入。

+2

尝试在没有'begin ... rescue..end'块的情况下运行'import'动作,这里有99%的错误。 – 2014-09-02 15:03:23

+0

我评论了开始/救援/结束,它没有任何区别 - 实际上,并不完全正确。由于:file参数未知,导致出现错误。现在我唯一玩的就是** logger.info(params.to_yaml)**来查看** params **中可用的内容,并且没有**文件**值。 – 2014-09-02 15:58:46

+0

您的文件是否正确上传? – 2014-09-02 16:07:58

回答

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导航。