勉強していて、2つの動きに違いがあることに気が付き
更に同様の内容について、調べられているQiitaの記事も見つけたため
自分のローカルでも動作を確認しながらメモ程度にまとめてみたいと思います
まずは、投稿用の簡易アプリを作成する
class PostsController < ApplicationController
def index
@posts = Post.where(user_id: @user.id)
end
def new
@posts = Post.new
end
def crate
@posts = Post.create(
title: params[:post][:title],
contents: params[:post][:contents],
user_id: @user.id
)
if @posts.save
redirect_to posts_index_path
else
render :new
end
end
end
マイグレーションファイル
class CreatePosts < ActiveRecord::Migration[5.2]
def change
create_table :posts do |t|
t.string :title, null: false
t.text :contents
t.string :user_id
t.timestamps
end
end
end
テーブル ※わかりやすいように※をつけてます
sqlite> .schema posts
CREATE TABLE IF NOT EXISTS "posts" (
"id" integer NOT NULL PRIMARY KEY,
"title" varchar NOT NULL,
"contents" text DEFAULT NULL,
"user_id" integer DEFAULT NULL,
"created_at" datetime NOT NULL,
"updated_at" datetime NOT NULL);
タイトル(title)には、「NOT NULL」制約をつけました
タイトルを空にして投稿してみる
~/environment/rails/sample_app
❯ rails c
Running via Spring preloader in process 23513
Loading development environment (Rails 5.2.4.4)
[1] pry(main)> Post.all
Post Load (1.1ms) SELECT "posts".* FROM "posts"
=> []
中身がはいっていないことを確認する
<h1>投稿新規作成画面</h1>
<%= form_with(model: @posts, url: posts_crate_path, local: true) do |f| %>
<%= f.text_field :title %>
<%= f.text_area :contents %>
<%= f.submit '確認画面へ' %>
<% end %>
###タイトルが空のまま入力してみる
空のまま入力してみて、コンソールを確認すると
~/environment/rails/sample_app
❯ rails c
[2] pry(main)> Post.all
Post Load (1.6ms) SELECT "posts".* FROM "posts"
=> [#<Post:0x00007f956380e990
id: 1,
title: "",
contents: "テスト contents",
user_id: 1,
created_at: Mon, 28 Dec 2020 07:43:20 UTC +00:00,
updated_at: Mon, 28 Dec 2020 07:43:20 UTC +00:00,
posted_date: nil>]
保存されていることがわかった
###「NOT NULL制約では」…
「空文字("")」を拒否することが出来ない
なので、今回のように保存されてしまう
「null」と「空文字("")」は全くの別もの
##「null」と「空文字("")」の違い
Rubyにおける「null」つまり「nil」は…
・false
と同じように「偽」として扱われる
・NilClassのインスタンス
・器も中身も何もない状態
「空文字("")」は…
・""は、空白が存在する
##空文字を拒否したければ…
モデルにバリデーションを付与する
class Post < ApplicationRecord
belongs_to :user
# 空文字を拒否する
validates :title, presence: true
end
上記を設定すれば、フォームに何も入力しなくても(空文字)
データに反映されることはない
##参考記事
https://qiita.com/wonder_meet/items/fa804f0d436a29c97460
https://qiita.com/tsuchinoko_run/items/c9214379a1f2878ec4ee