1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails「Not Null制約」と「バリデーション(presence: true)」 メモ

Posted at

勉強していて、2つの動きに違いがあることに気が付き
更に同様の内容について、調べられているQiitaの記事も見つけたため
自分のローカルでも動作を確認しながらメモ程度にまとめてみたいと思います

まずは、投稿用の簡易アプリを作成する

app/controller/posts.controller.rb
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

マイグレーションファイル

db/migrate/☓☓☓_create_posts.rb
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"
=> []

中身がはいっていないことを確認する

app/views/posts/new.html.erb
<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のインスタンス
・器も中身も何もない状態

「空文字("")」は…
・""は、空白が存在する

##空文字を拒否したければ…
モデルにバリデーションを付与する

app/models/user.rb
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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?