更新日:
【Rails】 blank?メソッドの使い方と返り値
blank?メソッドは、blank?メソッドを使用したオブジェクトが空白の場合はtrueを返し、オブジェクトが空白ではない場合はfalseを返すメソッドです。
1
オブジェクト.blank?
オブジェクトが空白とは、以下のように空文字, 空白文字, false, nil
のことを指します。
1
2
3
4
5
6
7
8
9
# filename: コンソール | blank?メソッドでtrueが返る場合のオブジェクト
[1] pry(main)> ''.blank? # 空文字
=> true
[2] pry(main)> ' '.blank? # 空白文字
=> true
[3] pry(main)> false.blank?
=> true
[4] pry(main)> nil.blank?
=> true
例えば、空文字を格納したname
にblank?メソッドを使用すると、以下のようにtrue
が返ります。
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
を返すメソッドです。
1
2
3
4
[1] pry(main)> name = ''
=> ""
[2] pry(main)> name.blank?
=> true
上記では、name
に対して空文字を格納しましたが、以下のコードのようにname
に文字を格納すると、オブジェクトは空白ではないのでfalse
が返ります。
1
2
3
4
[1] pry(main)> name = 'ぴっか'
=> "ぴっか"
[2] pry(main)> name.blank?
=> false
条件文
blank?メソッドは真偽値を返すので、if文を使ってオブジェクトが空白の場合と空白ではない場合で処理を分ける際に便利です。
1
2
3
4
5
if オブジェクト.blank?
# オブジェクトが空白の場合の処理
else
# オブジェクトが空白ではない場合の処理
end
例えば、name
が空白であれば「オブジェクトが空白です」を、空白でなければ「オブジェクトが空白でないです」とする場合は、以下のように記述します。
1
2
3
4
5
6
7
8
9
# filename: コンソール | 条件文にblank?メソッドを使う例
[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
4
# filename: コンソール | 三項演算子を使う例
【三項演算子の構文】 条件式 ? 空白の場合 : 空白ではない場合
[3] pry(main)> name.blank? ? 'オブジェクトが空白です' : 'オブジェクトが空白ではないです'
=> "オブジェクトが空白です"
present?メソッド
ActiveSupportのpresent?メソッドは、blank?メソッドの実行した真偽値の反対になるメソッドです。
オブジェクトが空白ではない場合にtrue
を返し、オブジェクトが空白の場合はfalse
を返します。
ActiveSupportでは、present?メソッドは以下のように定義されています。
1
2
3
def present?
!blank?
end
例えば、以下のようにname
に文字を格納してblank?メソッドを実行すると、オブジェクトは空白ではないのでfalse
が返ります。
1
2
3
4
[1] pry(main)> name = 'ぴっか'
=> "ぴっか"
[2] pry(main)> name.blank?
=> false
しかし、以下のようにpresent?メソッドを実行するとtrue
が返ります。
1
2
3
4
[1] pry(main)> name = 'ぴっか'
=> "ぴっか"
[2] pry(main)> name.present?
=> true
このように、present?メソッドはblank?メソッドを実行した真偽値の反対を返すメソッドです。
present?メソッドの詳しい使い方については、「present?メソッドの使い方」を参考にして下さい。
返り値
blank?メソッドは、オブジェクトが空白の場合はtrueを返すメソッドで、「空白とは主にnil, false, 空文字, 空白文字
のこと」だと冒頭で解説しましたが、これが全てではありません。
他にも空のハッシュ({}
)や空の配列([]
)があります。
blank?メソッドを実行した際に、どのオブジェクトがtrue
・false
を返すのか解説します。
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
が返る場合のオブジェクトは以下のようになります。
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
を返します。
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
を返します。
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, 真偽値, 空白文字
をチェックしてくれるメソッドなのです。
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演算子)
で確認していますが、読みづらく可読性が悪いコードになります。
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文を使ってリファクタリングする事が出来ます。
1
2
3
4
[1] pry(main)> name = ''
=> ""
[2] pry(main)> '名前が入力されていません。' if name.blank?
=> "名前が入力されていません。"
このようにpresent?メソッドでunless
やif + !(not演算子)
を使っているコードがあれば、blank?メソッドでリファクタリングする事が出来ますし、反対にblank?メソッドでunless
やif + !(not演算子)
を使っている場所があれば、present?メソッドでリファクタリングする事が出来ます。
この記事のまとめ
- blank?メソッドは、オブジェクトが空白の場合はtrueを返し、空白ではない場合はfalseを返すメソッド
- 空白とは、nil,false,空文字,空白文字,空配列,空ハッシュのこと
- blank?メソッドの実行結果の真偽値の反対を返すメソッドにpresent?メソッドがある