現役金融営業マンが未経験からエンジニアを目指すブログ

現役金融機関が、現職の行く末を憂いてエンジニアへの転身を図るべく勉強をしています。日々の学習ログを、なるべく残していきたい。ruby, python, javascript, html, cssなど。

【Ruby on Rails Tutorial】2.3.3 ユーザーはたくさんマイクロポストを持っている での単純なミス

ブログのポストをサボっていただけで、学習は続けていました。

学習の内容をいちいち記録するのはしんどいです。

ということで、Ruby on Rails Tutorial【第5版】を学んでいてわかりづらい点、 つまづいた点だけフォーカスして、それをどのように解決したかということだけ 記録していくやり方にしようかなと模索しています。 それではやっていきます

2.3.3 ユーザーはたくさんマイクロポストを持っている

一人のユーザー(usersのid)はたくさんのマイクロポストを持っているけど、 各マイクロポストは一人のユーザーに属している(紐づいているusersのidは一つだけ) というデータベース同士の関連付けを行うための記述について。

app/models/micropost.rb

class Micropost < ApplicationRecord
  belongs_to :user
  validates :content, length: { maximum: 140 },
                      presence: true
end

app/models/user.rb

class User < ApplicationRecord
  has_many :microposts
  validates :name, presence: true
  validates :email, presence: true
end

それぞれのclassの下に記載してある、 belongs_tohas_manyが大事なポイント。

f:id:hiroshimaeasy:20180918230112p:plain

ブラウザでプレビューしてみる。

urlの一番後ろに/micropostsをつけてアクセスしてみると、 f:id:hiroshimaeasy:20180918230334p:plain

ハマったのはここからだった

新規ユーザーが新規ポストしてみようとしてみた

f:id:hiroshimaeasy:20180918230614p:plain

その結果

f:id:hiroshimaeasy:20180918230645p:plain

エラー!!なにそれ! すごく単純なことでしたが、これに1日半悩まされました。

エラーの原因は簡単

=> 新規ユーザー = DB上存在しなかったusersのid = nil = false つまりrailsはデフォルトでは存在しないid = nilに対してfalseを返すので このようなエラー文が出るということ。 NOT NULLを設定してないので、デフォルトでは新規ユーザーは弾かれるということでした。 単純。

書かれてないことを安易に試してはいけない。 (という一方、変な冒険をしてみたので仕組みがわかったとも言える)