プログラミング備忘録

プログラミングの学習状況をメモしています

14日目

今日の学習

Ruby

CSVファイル

Rubyでは、CSVを読み込んだり生成することができる。

class CSV (Ruby 3.0.0 リファレンスマニュアル)

CSVファイルの読み込み

require "csv" と記述する。CSVファイルを読み込むクラスメソッドは二種類ある。

CSV.foreach("csvファイルへのパス")

CSVファイルを一行ずつ読み込み、何かしらの操作を行うメソッド。

CSV.read("csvファイルへのパス")

CSVファイルを全て読み込み、二次元配列を作成するメソッド。

headers: trueオプションをつけることで、一行目をキーとしたハッシュのような形式にすることが可能。

その後、あらかじめ空配列を作成し、取得したハッシュを空配列に入れることで、ハッシュの配列にできる(readクラスの場合は空配列を用意しなくてもよい)。

読み込んだデータに、findメソッドなどを用いることで、データを元に様々な分析ができる。

例 listデータの、idが6のデータを参照したいとき

list.find { |data| data[:id] == 6 }
CSVファイルの生成
CSV.open("sample.csv", "wb") do |csv|
  csv << ["id", "name", "email"]
  csv << ["1", "名前", "メールアドレス"]
  csv << ...........
end

このような記述をした後、Rubyのファイルを実行することでcsvファイルを作成することができる。

Faker

ダミーデータを生成してくれるgem。

GitHub - faker-ruby/faker: A library for generating fake data such as names, addresses, and phone numbers.

今回は練習のために、名前やメールアドレスのダミーデータを生成してみたが、上記のサイトを確認すると他にも色々なダミーデータが作れるようだ。ちょっと面白い。

TRPGにめちゃくちゃ使えそうだなと思って見ていると、Lovecraftというコマンドが用意されていた。

Fakerを使ってみました!(使い方と実行例) - Qiita

分かりやすい使用例。

Ruby on Rails

ransackの利用(検索機能)

ransackという、検索機能を実装するためのgemについて学習。

GitHub - activerecord-hackery/ransack: Object-based searching.

gemを記述したあとに、bundle installでインストールをするだけ。

カラム名_cont ...部分一致検索 カラム名_eq ...一致検索

ページネーション

大量のデータを一括で表示するのではなく、分割して表示をすることで、サーバーの負担を減らし、ブラウザの表示速度が遅くなることを防ぐ。

ページネーション実装にあたり、kaminariというgemを利用してみた。

GitHub - kaminari/kaminari: ⚡ A Scope & Engine based, clean, powerful, customizable and sophisticated paginator for Ruby webapps

投稿アプリの作成

やんばるエキスパートの課題に取り組む。以下、重要なポイントのメモ。

モデルの作成

rails g modelコマンドでは、テーブルが作成されないため、マイグレーションファイルでカラムに制約を入れたあとに

rails db:migrate

マイグレーションを実行し、データベースにテーブルを作成する。

コレクションをレンダリング

each文を使わずに、部分テンプレートの仕組みを使って同じ要素を複数回表示させる。

Viewでの繰り返しをコレクションをレンダリングすることで実装する【Rails】 - Qiita

migrationでの失敗

初期データ登録のためのrails db:seedコマンド実行の際に、何度も手違いを起こしてエラーを頻発してしまっている。

『You have 1 pending migration』と言われてしまったり、どこかを間違えていてマイグレーションできなかったり...。

どこかでつまづいたとき、最初からもう一度やり直すことがあり、その際に以前のデータが邪魔をしてしまっているのかもしれない。

一度rails db:migrate:resetをして、再度進めていくとデータの登録に成功したが...。

[Rails]migration恐怖症からの脱却 - Qiita

この記事の方の仰る通りで、まだ一人で練習しているうちなので気軽にresetでやり直しているが、マイグレーション周りのことをもっと理解する必要があると強く感じた。

新規投稿機能がうまく実装できない

フォームを設置したところまではよかったが、内容を入力して送信ボタンを押すと、No route matches [POST] "/"とエラーが出てしまう。

rails routesでルーティングを確認してみると、HTTPメソッドが[POST]でパスが"/"のルーティングが存在しない。

form_withを使ってsubmitを行う場合、ルーティングはどのように決定されているのかが理解できていない。

form_withの中で、ここに情報を飛ばしてくださいねとurlを指定すると、無事に情報が飛んでいくようになった。

ストロングパラメータの箇所でエラー

param is missing or the value is empty: post

と言われてしまう。実際の記述はこれ。

 def create
    @post = Post.create!(post_params)
    redirect_to root_path
  end

  def post_params
    params.require(:post).permit(:body)
  end

binding.pryparamsの中身を見てみると、しっかりと入力データを受け取っているが、@postを見てみるとnilと表示される。

form_withには、しっかりと@postに紐づけてあるため原因はここではない。

【Rails】param is missing or the value is empty:について - Qiita

こちらにある通り、require(:post)を削ると無事に投稿ができた。

requireはデータのオブジェクト名を定めるメソッドのようだが、消してしまってもいいんだろうか。

フロント側のバリデーション

バリデーションを、フロント側で判定させる。

text_fieldのようなフォームの部分に、required: trueを追加することで可能。

フロント側で処理できるものはフロント側で処理をして、少しでもサーバーの負担を軽減させることに気を配る必要がある。

<input required>-HTML5タグリファレンス

ものすごく時間がかかったが、課題が完成した!

エラーの意味ひとつひとつを理解して、同じエラーが出た時にすぐ対処できるようにしたい。

input要素のrequired属性を指定すると、 その入力項目が入力必須であることをブラウザに知らせることができます。