[英]Rails Import CSV - No Route Matches
我是Rails的新手。 我目前正在嘗試將數據從csv文件導入到我的Rails應用程序中。 但是,當我在線上查看示例和指南時,出現了錯誤: 沒有路由與{:action =>“ import_csv”,:controller =>“ lists”}匹配,但是我已經將其添加到route.rb中。 如果我的代碼導致“沒有路線匹配”錯誤,誰能幫助我檢查哪里出了問題? 以下是我的文件:
def import_csv
require 'fastercsv'
respond_to do |format|
@csv=params[:file].read
@n=0
@parsed_file = CSV.parse(csv)
@parsed_file.each do |row|
@user_new = User.new
@user_new.first_name = row[0]
@user_new.last_name = row[1]
@user_new.email = row[2]
@user_new.address = row[3]
@user_new.city = row[4]
@user_new.state = row[5]
@user_new.zip = row[6]
@user_new.country = row[7]
@user_new.notes = row[8]
@user_new.birthday = row[9]
@user_new.home_number = row[10]
@user_new.mobile_number = row[11]
@user_new.list_id = list_id
@user_new.save
@n=@n+1
GC.start if n%50==0
flash[:notice] = "CSV Imported Successfully, with #{n} records"
end
format.html { redirect_to lists_url }
format.json { head :no_content }
end
end
<%= form_for(:list, :url => list_import_csv_path, :html => {:multipart => true}) do |f| %>
<table>
<tr>
<td><label for="dump_file">Select a CSV File :</label></td>
<td ><%= file_field_tag :file %></td>
</tr>
<tr>
<td colspan='2'><%= submit_tag 'Submit' %></td>
</tr>
</table>
<% end %>
resources :lists do
get 'import_csv'
#match '/import_csv/:id' => 'lists#import_csv', :as => :import_csv
end
identities GET /identities(.:format) identities#index
POST /identities(.:format) identities#create
new_identity GET /identities/new(.:format) identities#new
edit_identity GET /identities/:id/edit(.:format) identities#edit
identity GET /identities/:id(.:format) identities#show
PUT /identities/:id(.:format) identities#update
DELETE /identities/:id(.:format) identities#destroy
newsletter_cancel GET /newsletters/:newsletter_id/cancel(.:format) newsletters#cancel
newsletters GET /newsletters(.:format) newsletters#index
POST /newsletters(.:format) newsletters#create
new_newsletter GET /newsletters/new(.:format) newsletters#new
edit_newsletter GET /newsletters/:id/edit(.:format) newsletters#edit
newsletter GET /newsletters/:id(.:format) newsletters#show
PUT /newsletters/:id(.:format) newsletters#update
DELETE /newsletters/:id(.:format) newsletters#destroy
list_import_csv GET /lists/:list_id/import_csv(.:format) lists#import_csv
lists GET /lists(.:format) lists#index
POST /lists(.:format) lists#create
new_list GET /lists/new(.:format) lists#new
edit_list GET /lists/:id/edit(.:format) lists#edit
list GET /lists/:id(.:format) lists#show
PUT /lists/:id(.:format) lists#update
DELETE /lists/:id(.:format) lists#destroy
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
使用post
而不是get
config/routes.rb
。
您的表單是通過POST提交的,而路由是針對GET的。 無論是通過:method => :get
到form_for
助手,或更改路線post
(我寧願前者雖然,因為你請求的數據,在服務器上不改變任何東西)。
要為表單指定GET方法,您需要
<%= form_for (:list, :url => list_import_csv_path, :method => :get, :html => {:multipart => true}) do |f| %>
我也不確定強制啟動垃圾回收是否是個好主意-如果在處理請求時啟動垃圾回收會破壞您的性能。 剩余的對象應自動收集垃圾。
我還將提取User導出部分(可能是在User model
上的靜態方法中):
require 'faster_csv'
class User < ActiveRecord::Base
...
def self.import_from_csv(file)
CSV.parse(file).each do |row|
u = User.new(:first_name => row[0], :last_name => row[1] ...etc)
return false if !u.save
end
end
end
然后,在控制器中:
def import_csv
respond_to do |format|
if !User.import_from_csv(params[:file])
format.html { render :show, :error => "Some error here" }
format.json { render :json => "Some error here", :status => :unprocessable_entity }
else
format.html { redirect_to lists_url, :notice => "Import successful!" }
format.json { :head => :ok }
end
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.