【Rails】 CSV 파일에서 데이터 가져오기

5806 단어 CSV루비Rails
간단한 TODO 앱에 CSV 파일에서 작업을 추가하는 기능을 구현합니다.
절차는 다음 기사에서 설명한 것과 거의 동일합니다. 엄청 도움이 되었습니다.
【Ruby on Rails】 CSV 가져오기

구현



태스크 추가, 편집, 삭제 기능, 로그인 기능 등이 있는 TODO 앱에 CSV 업로드 기능을 구현해 갑니다.
Ruby on Rails로 간단한 앱 만들기
【Rails】 로그인 기능 구현

루비 표준 라이브러리 csv 추가



/config/application.rb
require 'csv'

roo라는 gem 추가



csv 파일을 로드할 gem roo를 추가합니다.

Gemfile
gem 'roo'

terminal
$ bundle install

작업 목록 화면에 CSV 업로드용 필드 추가



/app/views/tasks/_logged_in.html.erb
<%= form_tag import_tasks_path, multipart: true do %>
  <%= file_field_tag :file %>
  <%= submit_tag "インポート" %>
<% end %>

컨트롤러에 액션 추가


Task.import(params[:file]) 로 사용되고 있는 import 메소드는 나중에 정의합니다.

/app/controllers/tasks.controller.rb
def import
  Task.import(params[:file])
  redirect_to root_url
end

라우팅 설정


collection {post :import} 로 쓰면 resources :tasks 로 작성된 라우팅 이외의 tasks 컨트롤러 액션에 대한 라우팅을 추가할 수 있습니다.

/config/route.rb
resources :tasks do
  collection {post :import}
end

terminal
$ rails routes
.
.
import_tasks POST   /tasks/import(.:format)   tasks#import
.
.
import_tasks 라는 명명된 경로가 추가되었습니다.

모델에 CSV를 읽어 등록 처리를 구현



/app/models/task.rb
#importメソッド
def self.import(file)
  CSV.foreach(file.path, headers: true) do |row|
    # IDが見つかれば、レコードを呼び出し、見つかれなければ、新しく作成
    task = find_by(id: row["id"]) || new
    # CSVからデータを取得し、設定する
    task.attributes = row.to_hash.slice(*updatable_attributes)
    task.save
  end
end

# 更新を許可するカラムを定義
def self.updatable_attributes
  ["title", "user_id"]
end

동작 확인



다음과 같은 파일을 준비합니다.

taskForTodoApp.csv
title,user_id
パンを買う,2
筋トレ,2
メルカリの発送,8
ティッシュを交換する,2

실행 결과


빠진 포인트



· CSV 파일에 user_id를 기재하지 않았으며 데이터베이스에 등록 할 때 오류가 발생했을 때 조금 빠졌습니다.

TODO



· TSV 파일도 가져올 수 있도록

참고



【Ruby on Rails】 CSV 가져오기

좋은 웹페이지 즐겨찾기