テーブルにデータを追加する

はじめに

現状、以下のようなエラーが発生している。

エラーの分析

以下のエラーは、空のクラスに対して、eachというメソッドは定義されていないという意味。

undefined method `each' for nil:NilClass

'.freeze;     @posts.each do |post| 
              ^^^^^^

nilとは、存在しないという意味。

nil? empty? blank? present? の使い分け #Ruby – Qiita

@postsの定義箇所

コントローラーで以下のように定義している。postsテーブルからすべてのレコードを取得したものが、インスタンス変数の@postに入っている。

rails cで対話型モードを起動

rails cで、対話型モードを起動させることができる。

rails console の基本 #Ruby – Qiita

起動させた様子。

@postの中身が存在しないことを確認してみる

@post.nil?の結果は、true。

postsテーブルの構造を確認してみる

まずは、rails dbでデータベースの対話モードを起動。

.tablesで、テーブルの一覧を確認できる。その中に、postsテーブルがあった。

.schems テーブル名で、テーブル名を指定して、テーブルの構造を間接的に確認することができた。間接的にというのは、これで確認できるのが、命令文だからだ。日本語にすると、もしpostsテーブル(カラム名やデータ型、null制約などの指定)が存在しなかったら、作成しなさいとなる。

sqlite> .schema posts
CREATE TABLE IF NOT EXISTS "posts" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "content" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);

現状は、テーブルはあるが、中身が空という状況だろう。

postsテーブルに値を入れる

ここで本題に入ろう。

railsコンソールでレコードを追加していく。

まずは、データベースの対話モードを、.exitで終了する。

そして、rails cで対話モードを起動する。

createメソッドで、レコードの追加を行う。

Railsコンソールを使ってレコード追加する方法 #Rails5 – Qiita

無事に、レコードを挿入することができた。

挿入されたレコードはこちら。

id: 1, content: "最初の投稿", created_at: Wed, 14 Aug 2024 04:56:27.255770000 UTC +00:00, updated_at: Wed, 14 Aug 2024 04:56:27.255770000 UTC +00:00

エラーが解消しなかった

レコードを挿入したはずなのに、以下のエラー画面のままである。

エラーの真の原因

コントローラで定義した、@postと、

ビューで使用している、@postsの名前が違うことが原因だった。

コントローラの@postを@postsに変更すると、エラーが解消された。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

投稿ID : 23977