【Rails】オブジェクトの中身が存在するか判定する

【Rails】オブジェクトの中身が存在するか判定する

RailsのViewではデータの有無によって出し分けを行いたい場合がかなりあります。

例えば、あるモデルのカラムにデータが存在していればそのデータを出力し、もし無い場合は「データがありません」と表示するようなケースがよくありますね。

このような場合、モデルのカラムにデータが存在するかをViewで判定する必要があります。
そのためには「データがあるか?」という判定にオブジェクトの present? メソッドを使用します。

<% @posts.each do |post| %>
  <% if post.image.present? %>
    画像あり: <img src="<%= image.url %>" alt="">
  <% else %>
    画像はありません。
  <% end %>
<% end %>

上記のように、 post.image.present? と判定すれば image カラムにデータが存在するかどうかがわかります。

またオブジェクトにはその逆の意味の、「データが空か?」を判定するメソッドも提供されています。
データが空か判定するには blank? メソッドを使用します。
先ほどのpresent?のコードを書き直してみましょう。

<% @posts.each do |post| %>
  <% if !post.image.blank? %>
    画像あり: <img src="<%= image.url %>" alt="">
  <% else %>
    画像はありません。
  <% end %>
<% end %>

こちらは空かどうかを判定するので、画像があるかというのは ! を利用して blank? メソッドがfalseを返すかどうかを確認します。

上記の書き方だと、否定があることで少し回りくどいので次のように書くとわかりやすいです。

<% @posts.each do |post| %>
  <% if post.image.blank? %>
    画像はありません。    
  <% else %>
    画像あり: <img src="<%= image.url %>" alt="">
  <% end %>
<% end %>

最後におまけです。
if の代わりに unless を利用することもできますが、`else` 句が書けないので柔軟性に欠けます。

<% @posts.each do |post| %>
  <% unless post.image.blank? %>
    画像あり: <img src="<%= image.url %>" alt="">
  <% end %>
<% end %>

状況に応じて使い分けてください。

五十川 洋平(Yohei Isokawa)

五十川 洋平(Yohei Isokawa)

フロントエンドエンジニア/面白法人カヤックなどのWeb制作会社に勤務したのち、故郷の新潟に戻り独立。JSフレームワークAngularやFirebase、Google Cloud Platformを使ったWebアプリ開発が得意。 また、Udemyのプログラミング解説の講師、writer.appの自主開発や上越TechMeetupの主催などを行っています。

プロフィール

©Copyright 2022 Yohei Isokawa All Rights Reserved.