【Rails】blank?メソッドの使い方

Rails

blank?メソッドは、blank?メソッドを使用したオブジェクトが空白の場合はtrueを返し、オブジェクトが空白ではない場合はfalseを返すメソッドです。

blank?メソッドの構文
1
オブジェクト.blank?

オブジェクトが空白とは、主にnil, false, 空文字, 空白文字のことです。
例えば、空文字を格納したnameにblank?メソッドを使用すると、以下のようにtrueが返ります。

コンソール | blank?メソッドの使用例
1
2
3
4
[1] pry(main)> name = ''
=> ""
[2] pry(main)> name.blank?
=> true

blank?メソッドはRubyのメソッドではなく、Railsに入っているActiveSupportのgemのメソッドです。
Rails以外でもgemを入れると、blank?メソッドなどの便利なメソッドを使うことが出来ます。

blank?メソッドの使い方

この章では、blank?メソッドの基本的な使い方や返り値、他のメソッドとの違いを解説します。

基本的な使い方
リンクをコピーしました

blank?メソッドは、オブジェクトが空白の場合はtrueを返し、オブジェクトが空白ではない場合はfalseを返すメソッドです。

コンソール | blank?メソッドでtrueが返る使用例
1
2
3
4
[1] pry(main)> name = ''
=> ""
[2] pry(main)> name.blank?
=> true

上記では、nameに対して空文字を格納しましたが、以下のコードのようにnameに文字を格納すると、オブジェクトは空白ではないのでfalseが返ります。

コンソール | blank?メソッドでfalseが返る使用例
1
2
3
4
[1] pry(main)> name = 'ぴっか'
=> "ぴっか"
[2] pry(main)> name.blank?
=> false

条件文
リンクをコピーしました

blank?メソッドは真偽値を返すので、if文を使ってオブジェクトが空白の場合と空白ではない場合で処理を分ける際に便利です。

if文を使う場合
1
2
3
4
5
if オブジェクト.blank?
  # オブジェクトが空白の場合の処理
else
  # オブジェクトが空白ではない場合の処理
end

例えば、nameが空白であれば「オブジェクトが空白です」を、空白でなければ「オブジェクトが空白でないです」とする場合は、以下のように記述します。

コンソール | 条件文にblank?メソッドを使う例
1
2
3
4
5
6
7
8
[1] pry(main)> name = ''
=> ""
[2] pry(main)> if name.blank?
[2] pry(main)*    'オブジェクトが空白です'
[2] pry(main)* else
[2] pry(main)*    'オブジェクトが空白ではないです'
[2] pry(main)* end
=> "オブジェクトが空白です"

また、上記のコードは三項演算子を使って、以下のようにシンプルに記述する事も出来ます。

コンソール | 三項演算子を使う例
1
2
3
【三項演算子の構文】  条件式 ? 空白の場合 : 空白ではない場合
[3] pry(main)> name.blank? ? 'オブジェクトが空白です' : 'オブジェクトが空白ではないです'
=> "オブジェクトが空白です"

present?メソッド
リンクをコピーしました

ActiveSupportのpresent?メソッドは、blank?メソッドの実行した真偽値の反対になるメソッドです。
オブジェクトが空白ではない場合にtrueを返し、オブジェクトが空白の場合はfalseを返します。

ActiveSupport | present?メソッドの定義
1
2
3
def present?
  !blank?
end

例えば、以下のようにnameに文字を格納してblank?メソッドを実行すると、オブジェクトは空白ではないのでfalseが返ります。

コンソール | blank?メソッドを実行した場合
1
2
3
4
[1] pry(main)> name = 'ぴっか'
=> "ぴっか"
[2] pry(main)> name.blank?
=> false

しかし、以下のようにpresent?メソッドを実行するとtrueが返ります。

コンソール | present?メソッドを実行した場合
1
2
3
4
[1] pry(main)> name = 'ぴっか'
=> "ぴっか"
[2] pry(main)> name.present?
=> true

このように、present?メソッドはblank?メソッドを実行した真偽値の反対を返すメソッドです。
present?メソッドの詳しい使い方については、「present?メソッドの使い方」を参考にして下さい。

返り値
リンクをコピーしました

blank?メソッドは、オブジェクトが空白の場合はtrueを返すメソッドで、「空白とは主にnil, false, 空文字, 空白文字のこと」だと冒頭で解説しましたが、これが全てではありません。

他にも空のハッシュ({})や空の配列([])があります。
blank?メソッドを実行した際に、どのオブジェクトがtruefalseを返すのか解説します。

trueを返す場合
リンクをコピーしました

blank?メソッドを実行した際に、trueが返る場合のオブジェクトは以下のようになります。

コンソール | blank?メソッドでtrueが返る場合のオブジェクト
1
2
3
4
5
6
7
8
9
10
11
12
[1] pry(main)> ''.blank? # 空文字
=> true
[2] pry(main)> ' '.blank? # 空白文字
=> true
[3] pry(main)> [].blank?
=> true
[4] pry(main)> {}.blank?
=> true
[5] pry(main)> false.blank? 
=> true
[6] pry(main)> nil.blank? 
=> true

「空文字、空白文字、配列の器、hashの器、false、nil」の場合は、blank?メソッドの返り値がtrueです。
つまり、string・配列・ハッシュなど型の器はあっても中身がない場合はtrueになります。

falseを返す場合
リンクをコピーしました

次に、blank?メソッドを実行した際に、falseが返る場合のオブジェクトは以下のようになります。

コンソール | blank?メソッドでfalseが返る場合のオブジェクト
1
2
3
4
5
6
7
8
[1] pry(main)> 'str'.blank?
=> false
[2] pry(main)> ['arr'].blank? 
=> false
[3] pry(main)> {ket: 'value'}.blank?
=> false
[4] pry(main)> true.blank?
=> false

上記のように、それぞれの型で中身がある場合はfalseを返します。
blank?メソッドでfalseが返ったら、オブジェクトがどんな型でも何かしらの値が入ると考えられますが、以下のコードのように数字は0であっても全てfalseになります。

コンソール | 数字の場合に空白チェックされない例
1
2
3
4
5
6
[1] pry(main)> 0.blank?
=> false
[2] pry(main)> 0.0.blank?
=> false
[3] pry(main)> 1000.blank?
=> false

数字に対してblank?メソッドを使う事が出来ますが、0は空白(nil, false, 空文字, 空白文字)には当てはまらないので注意して下さい。

以下はblank?メソッドを実行した結果の真偽値をまとめた表です。

レシーバのオブジェクト 実行結果の真偽値
1 ''(空文字) true
2 ' '(空白文字) true
3 [](空配列) true
4 [' '](配列要素あり) false
5 {}(空ハッシュ) true
6 { key: value }(ハッシュ要素あり) false
7 0・0.0・1000 false
8 nil true
9 true false
10 false false

また、blank?メソッドと他の存在チェックのメソッドを比較したい場合は、データの存在チェックで真偽値を返すメソッドの表で確認する事が出来ます。

empty?メソッドとの違い
リンクをコピーしました

empty?メソッドはString、Array、Hash等に定義されているRubyのメソッドで、オブジェクトが空の場合はtrueを返し、空ではない場合はfalseを返します。

irb | empty?メソッドの使用例
1
2
3
4
5
6
irb(main):001:0> ''.empty? # String
=> true
irb(main):002:0> [].empty? # Array
=> true
irb(main):003:0> {}.empty? # Hash
=> true

そして、blank?メソッドと違って、nilや真偽値オブジェクトに対して実行すると、以下のようにエラーを出力します。

ファイルの場所 | スニペットの説明
1
2
3
4
5
6
irb(main):001:0> nil.empty?
NoMethodError: undefined method `empty?' for nil:NilClass
irb(main):002:0> false.empty?
NoMethodError: undefined method `empty?' for false:FalseClass
irb(main):003:0> true.empty?
NoMethodError: undefined method `empty?' for true:TrueClass

また、blank?メソッドは空白文字をtrueで返しましたが、empty?メソッドは以下の様にfalseを返します。

irb | 空白文字にempty?メソッドを使った場合
1
2
irb(main):014:0> ' '.empty?
=> false

blank?メソッドとempty?メソッドを比較してまとめると、以下の表のようになります。

レシーバのオブジェクト blank?メソッドの真偽値 empty?メソッドの真偽値
''(空文字) true true
' '(空白文字) true false
[](空配列) true true
[' '](配列要素あり) false false
{}(空ハッシュ) true true
{ key: value }(ハッシュ要素あり) false false
0・0.0・1000 false NoMethodError
nil true NoMethodError
true false NoMethodError
false false NoMethodError

つまりblank?メソッドは、以下のようにempty?メソッドのチェックに加えて、さらにnil, 真偽値, 空白文字をチェックしてくれるメソッドなのです。

コンソール | blank?メソッドの内容
1
2
3
4
5
6
7
8
[1] pry(main)> name = ''
=> ""
[2] pry(main)> !name || name.empty?
=> true
[3] pry(main)> name.blank?
=> true
[4] pry(main)> name.blank? === !name || name.empty?
=> true

blank?メソッドでリファクタリング
リンクをコピーしました

以下のコードは、present?メソッドでオブジェクトの値がないことをunless文if+ !(not演算子)で確認していますが、読みづらく可読性が悪いコードになります。

irb | unlessやif + notを使ってオブジェクトの中身をpresent?メソッドで確認する
1
2
3
4
5
6
[1] pry(main)> name = ''
=> ""
[2] pry(main)> '名前が入力されていません。' unless name.present?
=> "名前が入力されていません。"
[3] pry(main)> '名前が入力されていません。' if  !name.present?
=> "名前が入力されていません。"

しかし、present?メソッドの実行結果の真偽値の反対を返すblank?メソッドを使えば、以下のようにif文を使ってリファクタリングする事が出来ます。

irb | blank?メソッドを使ってリファクタリングする
1
2
3
4
[1] pry(main)> name = ''
=> ""
[2] pry(main)> '名前が入力されていません。' if name.blank?
=> "名前が入力されていません。"

このようにpresent?メソッドでunlessif + !(not演算子)を使っているコードがあれば、blank?メソッドでリファクタリングする事が出来ますし、反対にblank?メソッドでunlessif + !(not演算子)を使っている場所があれば、present?メソッドでリファクタリングする事が出来ます。

まとめ
  • blank?メソッドは、オブジェクトが空白の場合はtrueを返し、空白ではない場合はfalseを返すメソッドです。
  • 空白とは、nil,false,空文字,空白文字,空配列,空ハッシュのことです。
  • blank?メソッドの実行結果の真偽値の反対を返すメソッドにpresent?メソッドがあります。