ifの中にif文があって...!?!?
if文に関しては以前も紹介しているので割愛
気になる方はこちらから
なかなかややこしかった印象。
現状の私には時間がかかりました。
実際のコード
<% if user_signed_in? && @item.record.nil?%>
<% if current_user.id == @item.user_id %>
<%= link_to '商品の編集', `~`_path, method: :get, class: "item-red-btn" %>
<p class='or-text'>or</p>
<%= link_to '削除', `~`_path, method: :delete, class:'item-destroy' %>
<%else%>
<%= link_to '購入画面に進む', item_records_path(@item.id),class:"item-red-btn"%>
<% end %>
<% end %>
まずは実現したいことを整理
商品の編集 と 削除 と 購入画面に進む
上記3つのボタンの表示条件を整理していく。
実際に整理していった流れもせっかくなので記録してみます。
- ログインしているユーザーなのか
- itemは購入されているのか
- ページを訪れたユーザーはitemの出品者か
3つか?そんな単純じゃないだろ...
- 商品の編集と削除ボタン
- ログインしている出品者本人限定の表示
- 商品が売れて切れていれば表示はされなくても良い
- 購入画面へのボタン
- ログインしている出品者本人以外にのみ表示
- 商品が売れて切れていれば表示はされなくても良い
共通のものがあるか...
共通条件
ログインしていなくてはいけない・商品が売れて切れていれば表示はされない
パターン1
ログインしている出品者本人限定の表示
パターン2
ログインしている出品者本人以外にのみ表示
あ、きたかも...
インデントを下げる/字下げする/ネストする/入れ子にする
言い方は色々あるようですが、要は...
- 親子関係がわかりやすいように
- 読みやすいように
主に上記の2点
可読性にもつながるのでチーム開発の際には特に注意したい所になるかな?
今回もまさにそれを使って上記で整理した内容を表現していきます。
本題の解説
<% if user_signed_in? && @item.record.nil?%>
<% if current_user.id == @item.user_id %>
<%= link_to '商品の編集', **_path, method: :get, class: "item-red-btn" %>
<p class='or-text'>or</p>
<%= link_to '削除', **_path, method: :delete, class:'item-destroy' %>
<%else%>
<%= link_to '購入画面に進む', item_records_path(@item.id),class:"item-red-btn"%>
<% end %>
<% end %>
親:if user_signed_in? && @item.record.nil?
この条件がtrueでなかったら以下(子)の表示はされない
&&
は現状尚且
といった捉え方をしている
- サインインしているユーザーであれば
- 現状、購入情報テーブルにデータが無いのであれば
子 1:if current_user.id == @item.user_id
- このページに訪れているユーザーのidと出品者のidが一致しているのであれば
子 2:else
- 上記(子 1)の条件がtrueでないならば
注意点
- controller内のアクションに記載している変数名
- データベースの名称
- データベースのカラム名
などとも関係してくる