解決したいこと
①完売商品に対してもう一度購入ができてしまう
②出品者が販売中・完売どちらも商品の編集・削除ができてしまう
if文の分岐すごく苦手なんです。
どこをどう考えたらいいのかわからないので、まずは紙に書き出してみる。
出品者
自分の出品物の販売中商品だけ編集&削除OK **購入は全てNG**購入者
販売中商品のみ購入OK **編集&削除は全てNG**だいぶ絞れたので実際にコードにしてみます。
1<% if user_signed_in? %>
2 <% if current_user.id == @item.user_id %>
3 <% unless @item.purchase.present? %>
4 <%= link_to '商品の編集', edit_item_path(@item.id), method: :get, class: "item-red-btn" %>
5 <p class='or-text'>or</p>
6 <%= link_to '削除', item_path(@item.id), method: :delete, class:'item-destroy' %>
7 <% end %>
8 <% end %>
1行目
まずはログイン済ユーザーかどうかをチェック。
2行目
そのユーザーが出品者かどうかをチェック。
3行目
完売商品ではないかをチェック。
4〜6行目
3行目がunlessなので完売商品ではなければ(偽)編集&削除ボタンを表示させる。
時間がかかったのはこの後、どうしても購入ボタンが表示されてしまう。
elsifで分岐・・・いや違う。
もう一度if文で分岐・・・これも違う。
そもそも最初の分岐で売れてるか売れてないかを判断したらいいんじゃないか・・・?
そう思い、生み出した奇跡のコードがこちら。
<% if current_user.id == @item.user_id && @item.purchase.present? %>
わけがわからないですね😂
もう一度書いた図を見てみる。
OKなのは販売中商品のみということか。
しかし販売中商品に購入ボタンをつけてしまうと出品者にも購入ボタンが表示されてしまう。
そこでハッと気付く。
2行目
そのユーザーが出品者かどうかをチェック。
ここでelseを使えばユーザーではあるけど出品者ではない=購入者ということではないのかな?
1<% if user_signed_in? %>
2 <% if current_user.id == @item.user_id %>
3 <% unless @item.purchase.present? %>
4 <%= link_to '商品の編集', edit_item_path(@item.id), method: :get, class: "item-red-btn" %>
5 <p class='or-text'>or</p>
6 <%= link_to '削除', item_path(@item.id), method: :delete, class:'item-destroy' %>
7 <% end %>
8 <% else %>
9 <% unless @item.purchase.present? %>
10 <%= link_to '購入画面に進む', item_orders_path(@item.id),class:"item-red-btn"%>
11 <% end %>
12 <% end %>
13<% end %>
8行目
ログイン中ユーザーだけど出品者じゃない分岐。
9行目
3行目と同じく出品物が完売ではないかをチェック。
10行目
9行目がunlessなので完売商品ではなければ(偽)購入ボタンを表示させる。
うまいこといきました。 自己解決できるとまた一つ階段を昇れた気がします。 ※違っている点、もっと簡単に書けるよというものがあればご指摘頂ければ幸いです。
2021 1/4 一部修正。
1<% if user_signed_in? && @item.purchase == nil %>
2 <% if current_user.id == @item.user_id %>
3 <%= link_to '商品の編集', edit_item_path(@item.id), method: :get, class: "item-red-btn" %>
4 <p class='or-text'>or</p>
5 <%= link_to '削除', item_path(@item.id), method: :delete, class:'item-destroy' %>
6 <% else %>
7 <%= link_to '購入画面に進む', item_orders_path(@item.id),class:"item-red-btn"%>
8 <% end %>
9<% end %>
1行目
unlessで繰り返されていたものを1行目に追記。
@item.purchase == nilで、**「商品の購入情報がnil(まだ購入されていない)」**と表現。
4行ほど短く、コンパクトにすることができました。
生み出した奇跡のコードにちょっと近いかな?!と自分を褒め称えました。
奥が深い。