【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 %>

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

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

更新情報はTwitterでも配信しています