🔥
【Rails】「もうやめて!nilとempty の違いを軽視すると、開発者のライフはゼロよ!」
はじめに
タイトルでちょっとした遊び心を見せてしまい、お騒がせしました。
本題に入る前に、この話の元ネタをご紹介します。
本題
フォームバリデーションとそれに伴うRspecを記載している際、nil
と空文字列''
の違いについて疑問に思ったことをキッカケにこちらを記載しました。(ライフはまだあります。)
▼フォームバリデーションについての実装はこちら
nil
とは?
-
nil
は、値が「存在しない」または「未定義」であることを意味します。 - データベースでは、
nil
はNULL値として扱われます。
''
とは?
空文字列- 空文字列
''
は、値が存在するが、その長さが0の文字列を意味します。 - 文字列として扱われ、データベースでは空のテキストフィールドとして保存されます。
なぜ区別が重要か?
- バリデーション: Railsの
presence: true
バリデーションはnil
を無効とみなしますが、空文字列は有効とみなされることがあります。 - 条件分岐:
nil
と空文字列は、条件分岐で異なる結果をもたらす可能性があります。
コード例
バリデーション
class User < ApplicationRecord
validates :name, presence: true
end
どんな違いが発生するか?
-
name
がnil
の場合、バリデーションエラー。 -
name
が空文字列の場合、バリデーションを通過する可能性がある。
条件分岐
name = nil
puts "名前は未設定です" if name.nil?
# => "名前は未設定です"
name = ''
puts "名前は空です" if name.empty?
# => "名前は空です"
どんな違いが発生するか?
-
nil?
はnil
の場合にtrueを返します。 -
empty?
は文字列が空の場合にtrueを返します。
まずはこれだけ覚えて!城之内くん!
- nilの方を許容しない場合、presence: true バリデーションを使用する
とセットで覚えておきましょう
まとめ
-
nil
と空文字列''
は異なる概念です。 - バリデーションではnilを許容しないコードを書いた一方、Rspecでは空文字列のみテストするなどといったことは避けたいですね
参考
Discussion