【Ruby on Rails】 CSV 가져오기

7742 단어 CSV루비Rails
csv 가져오기 기능 구현 절차를 설명해 보았습니다.
참고 정도에 부디.

1.Rails 프로젝트 생성



1-1.Rails 프로젝트 작성


#terminal
rails new sample

1-2.Controller,View,Model 작성


#terminal
rails g controller Users
rails g model User name:string age:integer
rails db:migrate

1-3. CSV 출력용 샘플 데이터 작성



db/seeds.rb
User.create!(
  id: 1,
  name: "seinosuke",
  age: 24
)

User.create!(
  id: 2,
  name: "takanosuke",
  age: 31
)

User.create!(
  id: 3,
  name: "konosuke",
  age: 30
)

1-4.DB에 데이터 저장


#terminal
rails db:seed

1-5.Controller에 액션 추가



app/contollers/users_contoller.rb
def index
  @users = User.all
end

1-6.View 작성



app/views/users/index.html.erb
<h1>ユーザー一覧</h1>

<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>名前</th>
      <th>年齢</th>
    </tr>
  </thead>

  <tbody>
    <% @users.each do |user| %>
      <tr>
        <td><%= user.id %></td>
        <td><%= user.name %></td>
        <td><%= user.age %></td>
      </tr>
    <% end %>
  </tbody>
</table>


1-7. Route 편집



config/routes.rb
resources :users

1-8.rails s로 서버를 시작하고 URL : /useres를 지정하여 데이터 표시를 확인합니다.





2. CSV 업로드 기능 구현



2-1.ruby 표준 라이브러리인 csv 추가



config/application.rb
require 'rails/all'
require 'csv'

2-2.Gem인 roo(Excel, CSV, OpenOffice, GoogleSpreadSheet를 열 수 있음)를 추가하여 bundle install


#Gemfile
gem 'roo'

2-3.View에 CSV 파일 업로드를위한 입력 필드 추가



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

※아래와 같은 입력 필드가 표시된다


2-4.Route 추가



config/routes.rb
Rails.application.routes.draw do
  resources :users do
    collection { post :import }
  end
end

2-5.Controller에서 파일 수령, 리디렉션하는 import 추가



app/controllers/users_controller.rb
  def index
    @users = User.all
  end

  def import
    # fileはtmpに自動で一時保存される
    User.import(params[:file])
    redirect_to users_url
  end

2-6.Model에서 csv를 읽어 DB에 등록하는 임포트 처리를 구현



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

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

2-7. 이하 업로드용 파일을 준비



id,name,age
4,hiroto,60

2-8. 업로드(csv내 데이터가 표시되고 있는 것을 확인)





좋은 웹페이지 즐겨찾기