🔥

【Rails】「もうやめて!nilとempty の違いを軽視すると、開発者のライフはゼロよ!」

2024/04/12に公開

はじめに

タイトルでちょっとした遊び心を見せてしまい、お騒がせしました。
本題に入る前に、この話の元ネタをご紹介します。
https://www.youtube.com/watch?v=wuj3BeEgHQE

本題

フォームバリデーションとそれに伴うRspecを記載している際、nilと空文字列''の違いについて疑問に思ったことをキッカケにこちらを記載しました。(ライフはまだあります。)

▼フォームバリデーションについての実装はこちら
https://zenn.dev/take_tech/articles/e2f5bbfe8888ed

nilとは?

  • nilは、値が「存在しない」または「未定義」であることを意味します。
  • データベースでは、nilはNULL値として扱われます。

空文字列''とは?

  • 空文字列''は、値が存在するが、その長さが0の文字列を意味します。
  • 文字列として扱われ、データベースでは空のテキストフィールドとして保存されます。

なぜ区別が重要か?

  • バリデーション: Railsのpresence: trueバリデーションはnilを無効とみなしますが、空文字列は有効とみなされることがあります。
  • 条件分岐: nilと空文字列は、条件分岐で異なる結果をもたらす可能性があります。

コード例

バリデーション

class User < ApplicationRecord
  validates :name, presence: true
end

どんな違いが発生するか?

  • namenilの場合、バリデーションエラー。
  • nameが空文字列の場合、バリデーションを通過する可能性がある。

条件分岐

name = nil
puts "名前は未設定です" if name.nil?
# => "名前は未設定です"
name = ''
puts "名前は空です" if name.empty?
# => "名前は空です"

どんな違いが発生するか?

  • nil?nilの場合にtrueを返します。
  • empty?は文字列が空の場合にtrueを返します。

まずはこれだけ覚えて!城之内くん!

  • nilの方を許容しない場合、presence: true バリデーションを使用する

とセットで覚えておきましょう

まとめ

  • nilと空文字列''は異なる概念です。
  • バリデーションではnilを許容しないコードを書いた一方、Rspecでは空文字列のみテストするなどといったことは避けたいですね

参考

https://qiita.com/somewhatgood@github/items/b74107480ee3821784e6

https://qiita.com/godhuu0505/items/541110cb9821734b0623

Discussion