csv uploader抛出nil或空错误

时间:2015-08-24 18:16:44

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

我的网站有一个名为orders的表,订单模型和csv_files_controller(与订单控制器分开)。

在模型中我有以下内容:

  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},即使它在那里它也没有改变任何东西。

我无法弄清楚为什么会抛出错误。

更新9-1-15:

我做了很多改变,但现在我得到了 没有路线匹配[POST]“/ orders / 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。

1 个答案:

答案 0 :(得分:0)

答案是有道理的:

  1. 我摆脱了csv_files控制器等,并将所有代码移至原始订单控制器。

  2. 我试图使用form_for .... do | f |我不得不恢复到form_tag ....为表格做,并拼出所有内容以使帖子发挥作用。

  3. 代码剪辑:

  4. 型号:

      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
    

    我正在努力确保上传使用模型中的验证,因为它似乎正在跳过它。