はじめに
本記事は製品情報などのダミーデータを、DBにデータが保存されているかいないかで表示/非表示にする方法を解説するものです。
考えてみれば難しいことではないのですが、とても悩んで時間を使ってしまったので、今後のために残しておくことと、同じようなエラーに遭遇した方の助けになれば良いと思い、記事にしました。
環境
- 言語:Ruby
- フレームワーク:Rails
- DB:MySQL
やりたかったこと
DBに保存済みのレコードをトップページに表示し、DBに何も保存されていなければダミーデータの製品を表示させる。
該当箇所のコード(コントローラー)
class ItemsController < ApplicationController
before_action :authenticate_user!, only: [:new, :create]
def index
@items = Item.all.order('created_at DESC')
end
該当箇所のコード(ビューファイル)
<% if @items == nil %>
#製品を表示させるための処理(今回は割愛)
<% end %>
結果・・・・・
エラーは発生しないものの、ダミーデータが表示されない。。。
製品情報をDBに保存してみたところ、保存した製品自体は表示されるので、DBのデータを取得してトップページに反映させる処理自体は問題ない様子。
原因
if文の条件式にnil
を指定しましたが、if文がDB内を「空」と判断してくれなかった様子
解決策①
if文の条件式部分を下記のコードに変更 (配列の要素を指定する)
<% if @items[0] == nil %>
nilに対し配列の1つ目、すなわち[0]
を指定することにより、if文が「配列の1つ目が空」=「DBにデータは保存されていない」という判断をしてくれます。
これでDBにデータが保存されている時は保存されたデータを表示し、DBにデータが保存されていなければダミーデータを表示することができました。
解決策②
if文の条件式部分を下記のコードに変更 (empty?メソッドを用いる)
<% if @items.empty %>
emptyメソッドは要素が0の時にtrueを返すメソッドです。
これを条件式に指定することにより、DBに解決策①と同様の挙動をしてくれました。
さいごに
nilは条件指定で頻繁に使いますが、今回はそこに頭が集中するあまり他の方法論を検討していなかったのが時間を使い過ぎた原因と思っています。
一つの書き方が完答、というわけではありませんし、柔軟に考えるためにも様々な書き方を試してみるのも大事だなと感じました。