商品詳細表示及び編集機能
つまりshowアクション。
routesでルーティングを行い、index画面から遷移先のprefixを利用してパスを作成。
条件別に表示する項目を変える。
if文を利用し、
<% if user_signed_in? && current_user.id == @item.user_id %>
<%= link_to "商品の編集", "#", method: :get, class: "item-red-btn" %>
<p class="or-text">or</p>
<%= link_to "削除", "#", method: :delete, class:"item-destroy" %>
<% elsif user_signed_in? && current_user.id != @item.user_id %>
<%# 商品が売れていない場合はこちらを表示しましょう %>
<%= link_to "購入画面に進む", "#" ,class:"item-red-btn"%>
<%# //商品が売れていない場合はこちらを表示しましょう %>
<% else %>
<%end%>
と記述した。
しかし、
<%if user_signed_in?%>
<%if current_user.id == @item.user_id %>
編集ボタン
削除ボタン
<%else %>
購入ボタン
<%end %>
<%end %>
という記載の方が、user_signde_in?を2回記述しなくて良いのですっきりする。
次に edit アクション。
routes で同じくルーティングを行い、 show 画面から遷移先の prefix を利用してパスを作成。ログインしてない場合と、商品出品者でない場合は、 edit 画面に url 直接入力しても遷移しないように、 item コントローラーで edit アクションに
redirect_to action: :index unless user_signed_in? && current_user.id == @item.user_id
を記述。
必要なデータは @item = Item.find(params[:id])とした。
edit のビューで、
<%= render 'shared/error_messages', model: f.object %>
がエラーになったが、テキストフィールドの内容が何を表しているか記述してない時にエラーになった。 f は item の分だけ表しており、入力し、取得するデータが決まってないからエラーになるのだろう。
編集ページで入力された値が残り続けること、 f.collection_select(,,,,) で選択タブの前回の表示が残っていることを確認して完了。