1
0

More than 3 years have passed since last update.

if ~ .length != 0 空の値を探す

Last updated at Posted at 2020-10-30

空の値

課題として出品されている商品を一覧で表示するという機能を実装しているときのこと
if文で、ある条件式を書いていた

それは、

インスタンス変数が空であるとき、代わりにダミーの商品を表示せよ

というもの

if文やね
これは楽勝やろと意気揚々と取り組み始めた
記述し終わり、挙動を確認したが…

ダミーの商品が表示されない!
items_controller.rb

 def index
    @items = Item.order('created_at DESC')
  end
index.html.erb

####################↓DBに保存されている商品を表示する↓####################
<ul class='item-lists'>
    <% if @items %>
      <% @items.each do |item| %>
        <li class='list' >
          <%= link_to item_path(item.user_id) do %>
            <div class='item-img-content'>
            </div>
            <div class='item-info'>
              <h3 class='item-name'>
                <%= item.name %>
              </h3>
              <div class='item-price'>
                <span><%= item.price %>円<br>(税込み)</span>
                <div class='star-btn'>
                  <%= image_tag "star.png", class:"star-icon" %>
                  <span class='star-count'>0</span>
                </div>
              </div>
            </div>
          <% end %>
        </li>
      <% end %>

####################↓以下はダミー商品↓####################
    <% else %>
        <li class='list'>
          <%= link_to '#' do %>
          <%= image_tag "https://s3-ap-northeast-1.amazonaws.com/mercarimaster/uploads/captured_image/content/10/a004.png", class: "item-img" %>
          <div class='item-info'>
            <h3 class='item-name'>
              商品の出品
            </h3>
            <div class='item-price'>
              <span>0円<br>(税込み)</span>
              <div class='star-btn'>
                <%= image_tag "star.png", class:"star-icon" %>
                <span class='star-count'>0</span>
              </div>
            </div>
          </div>
          <% end %>
        </li>
    <% end %>
    </ul>
  </div>

「要はDBが空なら、インスタンス変数も空になるなるんやろ?」
という考えのもと動いていた

その時の自分は

「インスタンス変数が空の時」

という言葉にひたすら拘っていた記憶がある
それさえ抑えれば…!という、今思えば謎すぎる確信があった

確信は時に思考停止と同義になる

そうして1時間がすぎ、自分の中でようやくある疑念が浮かんだ
「…もしかしてテーブルが空だからって生成したものの中身も空になるとは限らないんじゃ?」
そしてparamsの中身が

配列になっていることを思い出した

空の値も入れられる上に、中身が完全に空でも配列が存在する時点で空であると認識されることはない

空の値であることを証明しなきゃならないのに空にならないとか詰んでるやん

と思い講師の方に助けを求めた
返ってきた答えは

「インスタンス変数の中身が空であることでfalseを返したいのに配列が生成されてしまう、ということなら、配列の要素の数が0かどうかで判断してみては?」

というものだった

つまり、こう!

index.html.erb
<ul class='item-lists'>
    <% if @items.length != 0 %> #←ココ!
      <% @items.each do |item| %>
        <li class='list' >
          <%= link_to item_path(item.user_id) do %>
#以下略

解釈を知る

つまり、

DBが空だろうがインスタンス変数の中身は配列になるのでその中身が空かどうかで判断してしまおう

というもの
.lengthで配列の数を渡し、!= 0 を指定することによって
0でない時trueが返されるというものになる

全く頭になかったものを提示されただけに、透き通るような爽やかな理解があった
同時に、「気づけたのでは?」と思う悔しさもあった

教訓

今回得た教訓は、一つの考えに拘らない
もっと俯瞰的に物事をみるということ

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0