2015-08-24 27 views
0

我有一個名爲orders,訂單模型和csv_files_controller(與訂單控制器分開)的表的網站。csv上傳器丟零或空錯誤

模型

我有以下幾點:

def self.import(csv_file) 
    CSV.foreach(csv_file.path, headers: true) do |row| 
     Order.create! row.to_hash 
    end 
    end 
csv_files_controller

我有以下幾點:

class CsvFilesController < ApplicationController 

    def new 
    @csv_file = CsvFile.new 
    end 

    def create 
    @csv_file = CsvFile.new(params[:csv_file]) 
    if @csv_file.save 
     Order.import 
     redirect_to csv_file, notice: "Orders uploaded successfully" 
    end 
    end 

    def show 
    @csv_file = CsvFile.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @csv_file } 
    end 
    end 
end 

upload_form部分正在從csv_files意見訂單意見由頁面呈現:

<%= form_for @csv_file do |f| %> 
    <div class="controls"> 
    <%= f.file_field :csv_file, accept: 'csv', :class => 'btn btn-xs btn-info' %>  
    <%= f.submit "Upload Orders", :class => 'btn btn-xs btn-success' %> 
    </div> 
<% end %> 

我的routes.rb也有

resources :csv_files 

,當我嘗試加載頁面上傳我得到一個First argument in form cannot contain nil or be empty error。我不確定我做了什麼錯誤的說法。

現在,如果我將form_for更改爲:csv_files頁面將加載,但它是空白的;沒有瀏覽文件或提交按鈕出現,但錯誤消失。雖然表單無法正常工作,但無所謂。我正在使用rails 4,所以我不應該需要他:html => {multipart: true},即使它在那裏它也沒有改變任何東西。

我不明白爲什麼它會拋出錯誤。

更新15年9月1日:

我已經犯了很多的變化,但現在我得到 沒有路由匹配[POST]「/命令/ upload_page」

但我耙路線顯示我已將我的發佈路線設置爲:import。

resources :orders do 
    collection do 
     post :import 
     get :upload_page, as: 'upload_page' 
     get :search, as: 'search' 
     get :csv_report, as: 'csv_report' 
     get :overdue_csv_report, as: 'overdue_csv_report' 
    end 
    end 

我不明白爲什麼它是路由發佈到upload_page。

+0

我想你在控制器中錯過了'@ csv_file'的'Order.import'方法。 –

+0

我嘗試添加一些東西,但沒有任何區別。 – Shenanigator

回答

0

答案是threfold:

  1. 我擺脫了csv_files控制器等和感動所有的代碼到原來的訂單控制器。

  2. 我正在嘗試使用form_for .... do | f |我不得不恢復到form_tag ....爲表單做好準備,拼出所有內容,讓帖子起作用。

  3. 代碼剪:

型號:

def self.import(csv_file) 
    CSV.foreach(csv_file, headers: true) do |row| 
     Order.create! row.to_hash 
    end 
    end 

控制器:

def import 
    Order.import(params[:csv_file].tempfile) 
    redirect_to orders_path, notice: "Orders imported" 
    end 

形式局部:

<%= form_tag import_orders_path, multipart: true do %> 
    <div class="controls"> 
    <%= file_field_tag :csv_file, accept: 'csv', :class => 'btn btn-xs btn-info' %>  
    <%= submit_tag "Upload Orders", :class => 'btn btn-xs btn-success' %> 
    </div> 
<% end %> 

路線:

resources :orders do 
    collection do 
     post :import 

我現在的工作對確保上傳使用驗證的模式,因爲它似乎跳過它。