我的网站有一个名为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。
答案 0 :(得分:0)
答案是有道理的:
我摆脱了csv_files控制器等,并将所有代码移至原始订单控制器。
我试图使用form_for .... do | f |我不得不恢复到form_tag ....为表格做,并拼出所有内容以使帖子发挥作用。
代码剪辑:
型号:
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
我正在努力确保上传使用模型中的验证,因为它似乎正在跳过它。