0

我是 Rails 新手,想回答一个问题:

我的表单上有一个上传 csv 字段,当我实际上传文件时它工作得很好。但是当我在没有附加文件的情​​况下点击上传按钮时,出现异常:nil:NilClass 的未定义方法“[]”。有没有办法留在同一页面上,而是显示“未上传文件”警告?

我试过做if(params[:model][:file].nil?) redirect_to model_path end,但它继续到代码的其余部分。在此先感谢您的帮助。

查看代码:

<%= form_for (@model), :url=>{ :controller=>"models", :action => 'create'}, :html=>{:multipart => true} do |f| %>           
    <p><%= f.label :file, 'Import csv file' %><br/>
      <%= f.file_field :file, :accept => "text/csv"%></p>
      <%= submit_tag "Upload" %>
  <% end %>

Controller Code:

        def create
   51     @model = Model.new
   52     
   53     @model.date_created = Time.now.utc
   54     
   55   
   56     #handles csv input    
   59     if(params[:model][:file])
   60       
   61       @model.id = SecureRandom.uuid; 
   62       file_data = params[:model][:file].read
   63       @parsed_file  = CSV.parse(file_data)
   64       n=0
   65       @parsed_file.each do |row|
   74   
   75         if @model.save
   76           n=n+1
   77         end 
   79       end

   81     else
   82       @model.id = "different type"
   83     end
   84 
   85       respond_to do |format|
   86         if @model.save
   87           if(params[:model][:file] )
   88             format.html { redirect_to @model, :notice => "Successfully imported the CSV file. #{n} new records added to the database" }
   89           else
   90             format.html { redirect_to @model, notice: 'Model entry was successfully created.' }
   91           end
   92           format.json { render json: @model, status: :created, location: @model }
   93         else
   94           format.html { render action: "new" }
   95           format.json { render json: @model.errors, status: :unprocessable_entity }
   96         end
4

3 回答 3

1

在控制器中尝试...

 if params[:model][:file].blank?
      flash[:error] = 'Fields cannot be blank.'
      redirect_to model_path
  end

第二件事..我不建议你使用“模型”作为控制器,因为它是 rails 关键字。使用另一个名称。

于 2013-05-30T11:11:17.337 回答
0

您应该使用 Jquery 验证。

例如 :

<form name="myform" id="myform" action="#" method="post">
<input type="file" name="myfile" id="myfile"  />
<input type="submit" name="submit" value="Submit" />
</form>

然后您可以使用以下代码在更改文件输入字段时验证它...

$(document).ready(function(){
    $("#myform").submit({
        var file_value = $('#myfile').val();
        if ( file_value.length =< 0 ){
            alert('No such file exist');
        }
    });
});

使用相同的功能,您也可以验证文件的格式。

var ext = $('#myfile').val().match(/\.(.+)$/)[1];
    switch (ext) {
        case 'csv', 'CSV':
           alert('CSV File- Correct File');
            break;
        default:
            alert('This is not an allowed file type.');
    }
于 2013-05-30T12:33:29.187 回答
0

要检查是否附加了文件以供上传,您可以简单地检查文件是否在 params 中退出

if params[:file]

如果要检查文件的扩展名,可以使用

File.extname(params[:file].path) == '.csv'

更好的方法是检查文件的内容类型并根据您可以使用的内容类型做出适当的响应

params[:file].content_type == 'text/csv'

于 2015-12-07T11:11:01.413 回答