0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Railsでの.present?活用術 - 空文字やスペースのnil変換

Last updated at Posted at 2025-08-17

はじめに

Railsを使っていると、フォーム入力やパラメータ処理で「空文字」「スペースだけの文字列」をどう扱うかが問題になることがあります。
普通にRubyのnil?empty?を使うと「スペースだけの文字列」はtrueにならず、判定ロジックが冗長になりがちです。

そこで便利なのが、Railsが提供する.present?.blank?です。
この記事では、特に.present?を中心に、その特徴と活用例を紹介します。

.present?とは?

RailsではObject#present?メソッドがActiveSupportによって拡張されています。

定義の概要

  • blank?の反対として定義されている

    • [補足]Railsでは .blank? は 、nil や空文字、空配列だけでなく 「スペースだけの文字列」も true となります
  • nilfalse、空文字列("")、空配列、空ハッシュはもちろん、「スペースのみの文字列(半角/全角)」もfalse判定になる

  • 逆に.present?は、それらの場合にはfalseを返す

つまり、.present?は「実際に意味のある値が存在する(=present)か」を簡潔に判定できるメソッドです。

サンプルコード

"".present?
# => false

"   ".present? # 半角スペースのみ
# => false

"  ".present? # 全角スペースのみ
# => false

nil.present?
# => false

"Hello".present?
# => true

通常のRubyでは " ".empty? #=> false となるため、余計な処理を書かなければなりません。
Railsの.present?なら、そのまま「スペースのみの文字列(半角/全角)」を無効値として扱えます。

典型的な活用シーン

1. フォーム入力のバリデーション前処理

if params[:name].present?
  user.name = params[:name]
end

このように書くと、ユーザーが空白だけを入力した場合も値を無効と扱えます。

2. モデルのコールバックでのデータ整形

before_save :normalize_name

def normalize_name
  self.name = nil unless name.present?
end

空白入力をnilに正規化できるので、DBのカラムがNULLか有効値だけになるように整えられます。

3. 短絡的な条件分岐

puts "値があります" if params[:keyword].present?

冗長なif params[:keyword] && !params[:keyword].empty?のような記述は不要です。

注意点

  • .present?はRails独自拡張であり、純粋なRubyには存在しません。Rails環境外で使うとエラーになります
  • 「数値の0」はpresent?true判定されます。空扱いにしたい場合は別途条件を設ける必要があります
    0.present?
    # => true
    

まとめ

  • .present?はRailsが提供する便利な判定メソッド
  • nil、空文字、空配列、「スペースのみの文字列(半角/全角)」 も無効扱いにできる
  • フォーム入力やDB保存前の整形に非常に有用
0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?