14日目
今日の学習
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。
今回は練習のために、名前やメールアドレスのダミーデータを生成してみたが、上記のサイトを確認すると他にも色々なダミーデータが作れるようだ。ちょっと面白い。
TRPGにめちゃくちゃ使えそうだなと思って見ていると、Lovecraftというコマンドが用意されていた。
Fakerを使ってみました!(使い方と実行例) - Qiita
分かりやすい使用例。
Ruby on Rails
ransackの利用(検索機能)
ransack
という、検索機能を実装するためのgemについて学習。
GitHub - activerecord-hackery/ransack: Object-based searching.
gemを記述したあとに、bundle install
でインストールをするだけ。
カラム名_cont
...部分一致検索
カラム名_eq
...一致検索
ページネーション
大量のデータを一括で表示するのではなく、分割して表示をすることで、サーバーの負担を減らし、ブラウザの表示速度が遅くなることを防ぐ。
ページネーション実装にあたり、kaminari
というgemを利用してみた。
投稿アプリの作成
やんばるエキスパートの課題に取り組む。以下、重要なポイントのメモ。
モデルの作成
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.pry
でparams
の中身を見てみると、しっかりと入力データを受け取っているが、@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属性を指定すると、 その入力項目が入力必須であることをブラウザに知らせることができます。