Rails에서 양식을 제출할 때 풀다운 메뉴 항목을 CSV 가져오고 DB 데이터에서 표시하고 싶습니다.

8348 단어 CSV루비Rails

소개



Rails에서 양식을 제출할 때 풀다운 메뉴 항목을 CSV 가져오고 DB 데이터를 사용하여 표시하기 위한 비망록입니다.

환경


  • macOS 10.15.6
  • Ruby 2.5.7
  • Rails 5.2.3
  • rspec-rails 4.0.1
  • capybara 3.32.2

  • 참고 URL



    CSV 가져오기 관련
    htps : // 코 m / 류타 1346 / ms / c21cb70b9879c66c8639
    htps : // 코 m / 소 r c- b / ms / 50 046 2 2764c12c21
    htps : // / cs. 루 by ぁん g. 오 rg / 그럼 / ㅁ st / c ぁ s / CSV. HTML
    htps : // m / 3 녀석 / ms / 416411c0 a 8f696dbf99
    htps : // 이 m / r tt l / ms / 672 336 03335c 6b34

    풀다운 메뉴 관련
    htps : // 이 m/Hr조차 d/있어 ms/56677d6c266d8 아 53 7
    htps : // 코 m/카와카미_쇼타로/있어 ms/11 아 677bf34136cb7686d
    htps : // 코 m / 코 뻐꾸기 t / ms / b58888506 41d1370fd1
    htps // c 리에 t. 네 t / po sts / 라이 ls
    htps : // 이 m/_아키라 19/이고 ms/c218186983f444c2d794

    국가 코드 목록 CSV
    htps : // 이 m / 타오 _s / ms / 3 ~ y2b90 아 2751 bfb d585

    목표


  • 풀다운 메뉴 옵션을 CSV 가져오기
  • DB의 데이터를 사용하여 풀다운 메뉴 선택 항목

  • 외형의 이미지입니다↓


    풀다운 메뉴 옵션은 DB에 저장된 열의 정보를 사용하여 표시됩니다↓


    구현



    CSV 가져오기와 폼의 풀다운화를 나누어 설명합니다.

    1. 풀다운 메뉴 옵션을 CSV 가져오기


  • 국가 이름 목록 저장을위한 Country 모델링
  • db/seeds.rb에 가져 오기 프로세스 추가
  • rails 명령으로 가져 오기 프로세스 실행

  • Ruby CSV 라이브러리를 사용하여 가져오기 프로세스를 수행합니다.
    이번에는 다음과 같은 CSV에서 국가 이름 목록을 가져왔습니다.
    작성한 CSV 파일이 루트 디렉토리에 추가되었습니다.

    country.csv
    番号,国・地域名,ISO 3166-1に於ける英語名,数,三字,二字,場所,各行政区分
    1,アイスランド,Iceland,352,ISL,IS,北ヨーロッパ,ISO 3166-2:IS
    2,アイルランド,Ireland,372,IRL,IE,西ヨーロッパ,ISO 3166-2:IE
    

    CSV는 국가 코드 목록 CSV을 사용했습니다.

    1. Country 모델링



    아래와 같은 모델을 만들었습니다.
    region 컬럼은 이번에는 사용하지 않습니다.


    attribute
    유형


    country_name
    문자열

    region
    문자열

    # Country モデル作成
    $ rails g model Country country_name:string region:string
    

    2. 가져오기 처리 추가



    가져 오기 프로세스는 seeds.rb에 추가되었습니다.
    별도 파일을 작성해 runner 명령으로 실행하는 방법 도 있는 것 같습니다.

    seeds.rb
    require "csv"
    
    # CSV ファイルへのパスは絶対パスで指定
    CSV.foreach("country.csv", headers: true) do |row|
      Country.create!(
        country_name: row["国・地域名"],
        region: row["場所"]
      )
    end
    

    3. 가져오기 처리 수행


    rails 명령으로 CSV 가져오기를 수행합니다.
    seed 파일에 다른 처리도 쓰고 있었으므로 이번에는 DB 내를 완전히 삭제하고 다시 가져왔습니다.
    # CSV をインポートしてDB に保存する場合はこれだけ
    $ rails db:seed
    
    # DB を消去して全て入れ直す
    $ rails db:migrate:reset
    $ rails db:seed
    
    # rails コンソールでインポートされたか確認
    $ rails c
    # インポートした国名の件数を確認
    > Country.count
    249
    

    2. 풀다운 메뉴의 선택 항목을 DB 데이터를 사용하여 표시



    새 게시시 양식 제출의 View 파일을 수정합니다.

    view/model_names/new.html.erb
    # 修正前
    <%= form_with model: @model_name do |f| %>
      <%= f.label :country %>
      <%= f.text_field :country %>
    
      <%= f.submit "送信" %>
    <% end %>
    

    view/model_names/new.html.erb
    # 修正後
    <%= form_with model: @model_name do |f| %>
      <%= f.label :country %>
      <%= f.collection_select :country, Country.all, :id, :country_name, prompt: "国を選択してください" %>
    
      <%= f.submit "送信" %>
    <% end %>
    
    # collection_select の文法
    <%= f.collection_select <保存先のカラム名>, <表示用の配列データ>, <保存する値のカラム名>,  <表示用のカラム名>, <オプション> %>
    
  • 대상 컬럼 이름 : country
  • 표시용 배열 데이터: Country.all
  • 저장할 값의 열 이름: id
  • 표시용의 컬럼명: country_name
  • 옵션: prompt 옵션으로 国を選択してください 표시
  • collection_select 의 사용법에 대해서는 여기 해설을 매우 알기 쉽습니다.

    학습


  • 검색 등의 후속 처리도 고려하여 가져오기
  • 옵션이 세로로 길어지기 때문에, 계층을 갖게하는 등 사용 용이성을 고려한 사용으로 변경하고 싶다

  • 추가



    RSpec의 풀다운 표시 테스트 중에 test 환경에서도 seeds.rb의 초기 데이터가 필요하기 때문에 환경별로 seeds.rb를 분할했습니다.
    test 환경에서의 풀다운의 표시가 되어 있지 않은 것을 눈치채지 않고 빠져 버렸으므로 비망록 를 추가했습니다.

    좋은 웹페이지 즐겨찾기