LoginSignup
1
1

More than 1 year has passed since last update.

CSVファイルのみを取り込むボタンをrailsで作る

Last updated at Posted at 2021-08-06

CSVファイルの取り込みはできたのですが、CSVファイルのみを指定する挙動のコードの部分で躓いてしまったため、記事に残したいと思います。

まずはviewです。ここではファイルのimportに関するボタンを作成しています。

index.html.erb

<div class="col-md-10 col-md-offset-1">
      <%= form_tag import_users_path(format: :csv), multipart: true do %>
        <%= file_field_tag :file, class: "btn btn-default" %>
        <%= submit_tag "CSVをインポート", class: "btn btn-md btn-primary btn-width" %>
      <% end %>
    </div>

次にusers_controllerに次の記述を行いました。
ここでファイルの末尾に".csv"と入っているファイルとそれ以外の挙動を書きます。

def import
    if File.extname(params[:file].original_filename) == ".csv"
      flash[:success] = 'CSVファイルを読み込みました'
      User.import(params[:file])
      redirect_to users_url
    else
      flash[:danger] = 'CSVファイルを選択してください'
      @users = User.all
      redirect_to users_url
    end
  end

次にuser.rbモデルでimportをしたcsvファイルについての処理を記述します。

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", "uid", "name", "role", "password", "password_confirmation"]
  end
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1