2013-05-29 27 views
0

我新的軌道,並想有一個問題回答:Ruby on 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 
+0

你需要顯示一些代碼,任何人都可以幫你做到這一點。除此之外,你調用的方法必須是空的,這就是爲什麼你得到這個錯誤 – David

回答

1

嘗試在控制器...

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

第二件事。我不會建議ü用「模式」作爲控制器bcoz它是軌道關鍵字。使用另一個名字。

+0

感謝您的轉發,它只適用於我調用params [:file]而不是params [:model] [:file],它仍然給出零誤差。任何想法爲什麼會發生這種事? – Mozbi

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.'); 
    } 
0

要檢查文件是否連接上載或沒有,如果你要來檢查文件的擴展名,你可以簡單地檢查文件是否退出在PARAMS與

if params[:file]

,你可以用

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

更好的辦法是檢查內容類型的文件和應對APPR opriately取決於內容類型,你可以用

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