質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1076閲覧

Ruby on Rails csvを取り込んでDBにインポートしたい

ruby_0ct

総合スコア57

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/11/27 06:23

編集2017/11/29 05:09

csvをアップロードしてデータベースに取り込みたいのですが、下記の通りコーディングするとコントローラーの部分でエラーになってしまいます。

どのようにすれば良いでしょうか?

エラー

NoMethodError in FormController#filecreate undefined method `import' for #<Class:0x007f9fa55995d8> Testnadatabase.import(params[:file])

csvimport.html.erb

<%= form_tag({controller: :form, action: :filecreate}, method: :post, multipart: true) do %> <p><%= file_field_tag :file %></p> <%= submit_tag 'インポート' %> <% end %>

form_controller.rb

def filecreate Testnadatabase.import(params[:file]) redirect_to action: :index end

/models/testnadatabase.rb

require 'csv' class Testnadatabase < ApplicationRecord def self.filecreate(file) CSV.foreach(file.path) do |row| Testnadatabase.create! row.to_hash end end end

###追記
ご回答ありがとうございます。
ご指摘の通り、filecreateにしたところ次の処理に進みました。
ですが、フィールドが空のままでレコードが生成されてしまうところで苦戦しています。

ヘッダーのないcsvなので、カラム名を指定していないことが原因かなと思っています。
model内でそれぞれのカラム名を指定すれば(ハッシュ化?)できそうと思うのですが、どのように書けばよいでしょうか?

また、 /models/testnadatabase.rbTestnadatabase.create! row.to_hash にある「 row.to_hash 」はヘッダーがないため、ここでハッシュ化しても無意味だと思い、削除しました。

require 'csv' class Testnadatabase < ApplicationRecord def self.filecreate(file) CSV.foreach(file.path) do |row| Testnadatabase.create! end end end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gouf

2017/11/28 04:59

コントローラ側でimport メソッドを呼び出していますが、モデル側のメソッド定義を見るに、正しくは filecreate ではありませんか?
guest

回答2

0

/models/testnadatabase.rb に import メソッドが定義されていないからではないでしょうか。

投稿2017/11/28 09:56

scivola

総合スコア2108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

modelでキーをそれぞれのカラムに割り当てて、ハッシュ化することで無事にできました。
予想通り、カラム名が指定されていなかったのが原因でした。

また、ハッシュ化されたものを引数でceateすれば、インポートされました。

require 'csv' class Testnadatabase < ApplicationRecord def self.filecreate(file) keys = [:カラム名1, :カラム名2, :カラム名3, :カラム名4] CSV.foreach(file.path) do |row| haskkeys = Hash[*keys.zip(row).flatten] Testnadatabase.create!(haskkeys) end end end

投稿2017/11/29 16:45

ruby_0ct

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問