こんにちは!フリーランスの桃太郎です。
Railsには変数の存在チェックを行うためのメソッドとしてpresentがあります。
この記事では、
・presentメソッドとは
・presentの使い方
という基本的な内容から、
・presentとpresenceメソッドの違い
・似た機能を持つ他のメソッド
などの応用的な使い方に関しても解説していきます。
presentについて正しく理解し、必要な場面で使いこなすことができるように、わかりやすく解説します!
presentメソッドの基本
presentメソッドとは
プログラムの処理の流れにおいて、変数の値が存在するか、しないかによって後続の処理を変更したい場面が良くあると思います。
そのような時に活用するのがpresentメソッドです。
presentは英語で”存在している”という意味があり、まさに存在チェックのためのメソッドです。
他にもnil、empty、blankなどのメソッドもありますが、使い方の違いなどは記事の後半で解説します。
使い方
では具体的な使い方を解説します。
基本形は以下の通りです。
(変数).present?
存在を確認したい変数に対して、カンマとpresent、そして最後にクエスチョンマークを付けます。
そして上記の構文は主にif文と合わせて使用されることが多いです。
例えば、データベースから値を取得する処理を行った後に、本当にデータが取れているかを確認する場面などに使われます。
@products = Product.where(name: ‘ハンドスピナー’) if @products.present? @msg = ‘ハンドスピナー入荷中!!!’ else @msg = ‘ハンドスピナー未入荷’ end
上記のようにpesentメソッドを使用することで、存在チェックの処理を簡単に実現できます。
presentとpresenceメソッドの違い
presentと似たメソッド名でpresenceメソッドがあります。
この2つのメソッドの違いについて以下の通りまとめました。
[判定値の存在有無により返る結果について]
値が存在する | 値が存在しない | |
present | true | false |
presence | 存在チェックした値自身 | nil |
つまり、presentはtrue/falseで結果が返却されるのに対して、presenceメソッドは存在すれば、その存在した値そのものを返す、存在しなければ、nilを返します。
また、railsには、presenceというキーワードをモデルのバリデーション機能でも使用しています。
そちらについて詳しく知りたい方は以下の記事を参考にしてください。
似た機能を持つ他のメソッド
存在チェックを行うpresentメソッドの他に、同じような機能をもつメソッドが他にもあります。
こちらも表にまとめます。
メソッド名 | 返却される値 |
nil? | 判定する値がnilであればtrue、そうでない場合はfalse |
empty? | オブジェクトが””(文字列の場合)や値が空白の場合はtrue、値が入っていればfalse |
blank? | nil?がtrueとなる場合、またはempty?がtrueとなる場合に、blank?はtrueとなります。blank?は値といえるものがない場合、trueとなります。 |
以下のサンプルにて合わせてご紹介します。
#コントローラ側の実装 def index @movies = Movie.all #存在する値 #@bookは存在しない値 if @book.nil? @nil_result = "nilです" else @nil_result = "nilではない" end if @movies.empty? @empty_result = "emptyです" else @empty_result = "emptyではない" end if @book.blank? @blank_result = "blankです" else @blank_result = "blankではない" end end #view側の実装 <%= @nil_result %></br> <%= @empty_result %></br> <%= @blank_result %>
実行結果
nilです #@bookは存在しないため、nil?による判定がtrue emptyではない #@moviesは存在するため、empty?判定がfalse blankです #@bookはnilのため、blank?判定がtrue
上記のサンプルにて注目いただきたいのが、blnak?です。
こちらは、nil?とempty?両方のチェックを兼ね備えており、presentメソッドとは正反対のチェックとなります。
つまり、presentメソッドは存在していればtrue、存在していなければfalseでした。
しかし、blankメソッドは存在していなければtrue、存在していればtrueとなります。
この辺りの使い分けは実際のプログラミングの流れで、存在していることを期待しているか、存在していないことを期待しているかによってメソッドを使い分けると良いでしょう。
なお、nil?やempty?はRubyの標準メソッドですが、blank?や今回のpresent?はRailsにて利用できるメソッドとなります。
まとめ
ここでは、presentについて、そもそもpresentとは、そしてその使い方はという基本的な内容から、presenceメソッドとの違いや類似機能をもつメソッドについてご紹介してきました。
プログラムの流れの中で、処理の前提となる変数が存在するかどうかということは実装を進めているとつい忘れがちになり、それが後から思わぬバグを生み出す原因にもなります。
存在チェックはpresent?で簡単に追加することができますので、ぜひ開発する際は心に留めておいてください。
もし、presentの使い方を忘れてしまったら、この記事を思い出してくださいね!