Railsのblank?やpresent?は積極的に使おう(翻訳)
Railsで作業中に、「値に意味のあるデータが含まれているかどうか」「値が事実上空かどうか」をチェックする必要が生じることがよくあります。Railsは、まさにそうした目的のために、blank?
とpresent?
という2つの極めて有用なメソッドをActive Support経由であらゆるオブジェクトにミックスインしています。
🔗 以下のように書くよりも
nil?
やempty?
などのチェックを組合せて使う。
def process_data(input)
if input.nil? || input.empty? || input.strip == ""
puts "No valid input provided"
else
puts "Processing: #{input}"
end
end
🔗 以下のように書こう
Railsのblank?
メソッドやpresent?
メソッドを使う。
# blank?を使う場合
def process_data(input)
if input.blank?
puts "入力が正しくありません"
else
puts "処理中: #{input}"
end
end
# present?を使う場合
def process_data(input)
if input.present?
puts "処理中: #{input}"
else
puts "入力が正しくありません"
end
end
🔗 そうする理由
blank?
メソッドとpresent?
メソッドは、複数のチェックを読みやすい単一のメソッド呼び出しにまとめています。これによりコードの表現力が高まり、ひと目で意味を理解できるようになります。
blank?
メソッドとpresent?
メソッドはActive Supportのコア拡張に含まれているので、文字列や配列やハッシュなど、さまざまなオブジェクトで同じように利用できます。これらのメソッドはホワイトスペース(スペース文字やTab文字や改行文字などの総称)のみを含む文字列を正しく空白と判定しますが、シンプルなempty?
はこれらの文字を空白でないと誤って判定します。
以下は、blank?
にさまざまな入力を与えた場合の簡単なサンプルです。
nil.blank? # => true
false.blank? # => true
true.blank? # => false
"".blank? # => true
" ".blank? # => true
"hello".blank? # => false
[].blank? # => true
{}.blank? # => true
1.blank? # => false
0.blank? # => false
present?
は、単にblank?
と逆の振る舞いになります。
value.present? # は!value.blank?と同等
🔗 そうしない理由があるとすれば
blank?
とpresent?
は実に重宝するメソッドですが、あえてこれらのメソッドを使わないようにする状況も若干あります。
Rails以外の純粋なRuby環境でこれらのメソッドを使おうとすると、active_support
gemをわざわざ追加しなければならなくなります。また「空白」の種類を区別しなければならない場合(nil
と空文字を区別するなど)は、これらのメソッドを使わずに詳しくチェックする必要が生じることもあるでしょう。
blank?
のようなメソッドは内部で複数のメソッドを使っているため、パフォーマンスが極めて重要なコードではシンプルなnil?
やempty?
よりもわずかに遅くなる可能性もあります。しかしこれは状況によって異なるものであり、現在の状況で問題になるかどうかを判断するにはベンチマークが必要になります。
🔗 関連するドキュメント
blank?
やpresent?
を使えば、ほとんどのRailsアプリケーションのコードをきれいにRailsらしく書けるようになり、コードのメンテナンス性も向上します。
以下の記事で紹介しているpresence
メソッドを使えば、コードの表現力もさらに高められます。
概要
元サイトの許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。