はじめに
本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。
nil? empty? blank? present? exists?メソッドについて
nil?
対象がnilの時はtrue
をそうでなければfalse
を返します。
nilは「何も存在しない」状態です(nullと同じ)。
sample = nil
p sample.nil?
# true
sample1 = ""
p sample1.nil?
# false
sample2 = 0
p sample2.nil?
# false
sample3 = []
p sample3.nil?
# false
empty?
empty?メソッドは対象が空の文字列や空の配列の場合にtrue
を返します。
また、NilClass
に定義されていないため対象がnilの場合にはNoMethodError
となります。
そのためnilの判定に使用することはできません。
sample1 = ""
p sample1.empty?
# true
sample2 = []
p sample2.empty?
# true
sample = " "
p sample.empty?
# false
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_support
と active_support/core_ext
を記述する必要があります。Rubyのみでは使えません。
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
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?メソッドでレコードの存在確認を行った後に、インスタンスを使って何か処理をしたいときに使用します。
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?メソッドレコードの存在チェックだけを行う場合に使用します。
if User.exists?(name: params[:user][:name])
"#{params[:user][:name]}さんは登録済みです。"
else
"#{params[:user][:name]}さんは登録されていません。"
end