0

Railsは初めてです。現在、csvファイルからRailsアプリケーションにデータをインポートしようとしています。ただし、オンラインで例とガイドを実行すると、エラーが発生しました。{:action => "import_csv"、:controller => "lists"}に一致するルートはありませんが、routes.rbにすでに追加しています。私のコードが「ルート一致なし」エラーを引き起こす場合、誰かが私が何が悪いのかをチェックするのを手伝ってもらえますか?以下は私のファイルです:

lists_controller.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

app / views / lists / show.html.erb

<%= 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 %>

ルート.rb

  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
4

2 に答える 2

0

postの代わりに使用getしてくださいconfig/routes.rb

于 2012-07-13T15:13:13.483 に答える
0

フォームはPOSTで送信されますが、ルートはGET用です。ヘルパーに渡すか:method => :get、ルートをに変更します(ただし、サーバー上のデータを変更せずにデータを要求しているため、前者の方が望ましいです)。form_forpost

フォームのGETメソッドを指定するには、次のようにします。

<%= form_for (:list, :url => list_import_csv_path, :method => :get, :html => {:multipart => true}) do |f| %>

また、ガベージコレクションを強制的に開始することをお勧めするかどうかもわかりません。リクエストの処理中にガベージコレクションが開始されると、パフォーマンスが低下します。残ったオブジェクトは自動的にガベージコレクションを取得する必要があります。

また、ユーザーエクスポート部分を抽出します(おそらくの静的メソッドに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
于 2012-07-13T15:16:43.147 に答える