1
0

More than 1 year has passed since last update.

【Rails】nil? empty? blank? present? exists?メソッドについて【Ruby】

Posted at

はじめに

 本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

nil? empty? blank? present? exists?メソッドについて

nil?

対象がnilの時はtrueをそうでなければfalseを返します。
nilは「何も存在しない」状態です(nullと同じ)。

trueを返す例
sample = nil
p sample.nil?
# true
falseを返す例
sample1 = ""
p sample1.nil?
# false

sample2 = 0
p sample2.nil?
# false

sample3 = []
p sample3.nil?
# false

empty?

empty?メソッドは対象が空の文字列や空の配列の場合にtrueを返します。
また、NilClassに定義されていないため対象がnilの場合にはNoMethodErrorとなります。
そのためnilの判定に使用することはできません。

trueを返す例
sample1 = ""
p sample1.empty?
# true

sample2 = []
p sample2.empty?
# true
falseを返す例
sample = " "
p sample.empty?
# false
対象がnilの場合
sample = nil
p sample.empty?

# Traceback (most recent call last):
# sample.rb:2:in `': undefined method `empty?' for nil:NilClass (NoMethodError)

blank?

blank?メソッドは、nil,false,""(空文字)," "(空白),[](空配列),{}(空ハッシュ)の場合にtrueを返します。
blank?メソッドはRailsで拡張されているメソッドなので使用する場合は、active_supportactive_support/core_extを記述する必要があります。Rubyのみでは使えません。

trueを返す例
require 'active_support'
require 'active_support/core_ext'

sample1 = nil
p sample1.blank?
# true

sample3 = " "
p sample3.blank?
# true

sample2 = ""
p sample2.blank?
# true

sample4 = []
p sample4.blank?
# true
falseを返す例
require 'active_support'
require 'active_support/core_ext'

sample1 = 0
p sample.blank?
# false

sample2 = "サンプル"
p sample2.blank?
# false

present?

present?メソッドは!blank?を実行します。
すなわち、nil,false,""(空文字)," "(空白),[](空配列),{}(空ハッシュ)の場合にfalseを返します。
また、後述のexists?メソッドとは異なり、条件に該当するレコードを全てデータベースから取得して、(Rails上のモデルの)配列として評価します。
そのため、使い所を間違えるとパフォーマンスに影響します。
present?メソッドでレコードの存在確認を行った後に、インスタンスを使って何か処理をしたいときに使用します。

present?の使用例
user = User.find_by(name: params[:user][:name])
if user.present?
  redirect_to user_path(user), notice: "ようこそ!#{user.name}さん!!"
else
  redirect_to root_path, alert: "#{params[:user][:name]}さんは見つかりませんでした。"
end

exists?

exists?メソッドは、指定した条件のレコードがデータベースに存在すればtrueを返します。
present?メソッドとは異なり、条件に合致するレコードが1件でも見つかればその時点でtrueを返します。
exists?メソッドレコードの存在チェックだけを行う場合に使用します。

exists?の使用例
if User.exists?(name: params[:user][:name])
  "#{params[:user][:name]}さんは登録済みです。"
else
  "#{params[:user][:name]}さんは登録されていません。"
end
1
0
1

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