Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Railsのblank?やpresent?は積極的に使おう(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。

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メソッドを使えば、コードの表現力もさらに高められます。

Rails: present?より便利なActiveSupportのpresenceメソッド(翻訳)

関連記事

Railsでnil? blank? empty? present?を使いこなそう


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。