行いたいこと
Pay.jpを使用しており、購入機能は実装済みです。
購入をした後に、インデックス画面で、商品が並ぶが、購入された商品に”sold out”の文字を表示したいです。
そして、購入した商品は再度購入できないような仕組みにしたいです。
#考えたこと
商品の購入処理を行った後 ordersコントローラーの@addres.saveの後に、購入した商品とわかるインスタンスを生成し、それをordersコントローラーのindexに渡して条件分岐をと考えていたが、
そうではなく、itemsとordersのアソシエーションからDBにあるidを用いて条件分岐をする方が単純で分かりやすいと教えていただいた。
この場合のアソシエーションの条件分岐をどうすれば良いか分からなかったため、知恵をお借りしたいです。
商品の表示、詳細画面などはitemsコントローラー、アクションを使用
商品の購入画面は、ordersコントローラー、アクションを使用
items,orderのDBの状態はこちらの画像のようになります。
アソシエーションで条件分岐を行うのが良いかと考えています。
itemsのDB
リンク
ordersのDB
リンク
主に今回使用する部分に必要なファイルのコードを載せます。
変更箇所は135行目から142行目の”商品が売れていればsold outを表示しましょう”の部分になります。
<%= render "shared/header" %> <div class='main'> <%# 画面上部の「人生を変えるフリマアプリ」帯部分 %> <div class='title-contents'> <h2 class='service-title'> 人生を変えるフリマアプリ </h2> <p class='service-explain'> FURIMAはだれでもかんたんに出品・購入できる </p> <p class='service-explain'> フリマアプリです </p> <div class='store-btn'> <%= link_to image_tag("https://linkmaker.itunes.apple.com/ja-jp/badge-lrg.svg?releaseDate=2011-09-21&kind=iossoftware&bubble=ios_apps", class:"apple-btn"), "#" %> <%= link_to image_tag("dl-android.png", class:"google-btn"), "#" %> </div> </div> <%# /画面上部の「人生を変えるフリマアプリ」帯部分 %> <%# FURIMAが選ばれる3つの理由部分 %> <div class='select-reason-contents'> <h2 class='title'> FURIMAが選ばれる3つの理由 </h2> <ul class='reason-lists'> <li class='list'> <%= image_tag "furima-intro01.png", class:"list-pict" %> <span class='reason-list-number'>1</span> <h3 class='reason-list-text'> <span class='reason-list-blue-text'>3分</span> ですぐに出品 </h3> <p class='reason-list-description'> スマホで入力するだけで簡単に出品できる! </p> </li> <li class='list'> <%= image_tag "furima-intro02.png", class:"list-pict" %> <span class='reason-list-number'>2</span> <h3 class='reason-list-text'> <span class='reason-list-blue-text'>シンプル</span> で使いやすい </h3> <p class='reason-list-description'> めんどくさい入力は必要なく、検索も購入もスムーズ! </p> </li> <li class='list'> <%= image_tag "furima-intro03.png", class:"list-pict" %> <span class='reason-list-number'>3</span> <h3 class='reason-list-text'> 手数料 <span class='reason-list-blue-text'>業界最安</span> </h3> <p class='reason-list-description'> 最大3%でお得に出品&購入! </p> </li> </ul> </div> <%# /FURIMAが選ばれる3つの理由部分 %> <%# 画面中央の「会員数日本一位」帯部分 %> <div class='ad-contents'> <h2 class='ad-title'> 会員数日本一位 </h2> <p class='ad-explain'> FURIMAは、フリマアプリで最も人気。 </p> <p class='ad-explain'> 出品・購入回数も業界最多です! </p> <p class='ad-explain'> ほしかったあの商品に出会えるかもしれません。 </p> <div class='store-btn'> <%= link_to image_tag("https://linkmaker.itunes.apple.com/ja-jp/badge-lrg.svg?releaseDate=2011-09-21&kind=iossoftware&bubble=ios_apps", class:"apple-btn"), "#" %> <%= link_to image_tag("dl-android.png", class:"google-btn"), "#" %> </div> </div> <%# /画面中央の「会員数日本一位」帯部分 %> <%# FURIMAの特徴 %> <div class='feature-contents'> <h2 class='title'> FURIMAの特徴 </h2> <ul class='feature-lists'> <li class='list'> <%= image_tag "furima-intro04.png", class:"list-pict" %> <h3 class='feature-list-text'> 簡単に売り買いできる </h3> <p class='feature-list-description'> スマホひとつで、いつでもどこでも簡単に出品・購入が可能! </p> </li> <li class='list'> <%= image_tag "furima-intro05.png", class:"list-pict" %> <h3 class='feature-list-text'> 売上金は即日振込みに対応 </h3> <p class='feature-list-description'> 午前9時までに振込を依頼いただければ、翌日に指定の口座に入金いたします。 </p> </li> <li class='list'> <%= image_tag "furima-intro06.png", class:"list-pict" %> <h3 class='feature-list-text'> 様々な支払いに対応 </h3> <p class='feature-list-description'> お支払いは、クレジットカードだけでなく、ポイントや売上金など多彩な方法があります。 </p> </li> </ul> </div> <%# /FURIMAの特徴 %> <%# 商品一覧 %> <div class='item-contents'> <h2 class='title'>ピックアップカテゴリー</h2> <%= link_to '新規投稿商品', new_item_path, class: "subtitle" %> <ul class='item-lists'> <% if @items.present? %> <% @items.each do |item|%> <li class='list'> <%= link_to item_path(item.id), method: :get do%> <div class='item-img-content'> <%= image_tag item.image, class: "item-img" if item.image.attached? %> <%# 商品が売れていればsold outを表示しましょう %> <div class='sold-out'> <span>Sold Out!!</span> <% end %> <%# //商品が売れていればsold outを表示しましょう %> </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> </li> <% end %> <% end %> <% else %> </div><% @items.each do |item|%> <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>99999999円<br>(税込み)</span> <div class='star-btn'> <%= image_tag "star.png", class:"star-icon" %> <span class='star-count'>0</span> </div> </div> </div> </li> <% end %> </ul> </div> <% end %> <% end %> <%# /商品一覧 %> </div> <div class='purchase-btn'> <span class='purchase-btn-text'>出品する</span> <% if user_signed_in? %> <a href= "/items/new"> <% else %> <a href= "/users/sign_in"> <% end %> <%= image_tag 'camera.png' , size: '185x50' ,class: "purchase-btn-icon" %> </a> </div> <%= render "shared/footer" %>
ordersのコントローラーは以下の通りになります。
class OrdersController < ApplicationController before_action :authenticate_user! before_action :move_to_index def index @item = Item.find(params[:item_id]) @address = OrderAddress.new end def create @item = Item.find(params[:item_id]) @address = OrderAddress.new(purchase_params) if @address.valid? pay_item @address.save return redirect_to root_path else render 'index' end end private def pay_item Payjp.api_key = ENV["PAYJP_SECRET_KEY"] Payjp::Charge.create( amount:@item.price, card: order_params[:token], currency: 'jpy' ) end def order_params params.permit(:token) end def purchase_params params.permit(:postal_code, :municipality, :house_number, :building_name, :phone_number, :area_id, :token, :order_id, :item_id).merge(user_id: current_user.id) end def move_to_index @item = Item.find(params[:item_id]) unless @item.user_id != current_user.id redirect_to root_path end end end
そして、itemsコントローラーが以下の通りになります。
class ItemsController < ApplicationController before_action :authenticate_user!, except: [:index, :show] before_action :set_item, only: [:show, :edit, :update, :destroy] before_action :prohibit_access, only: [:edit, :update, :destroy] def index @items = Item.all.order('created_at DESC') end def new @items = Item.new end def create @items = Item.create(item_params) if @items.save redirect_to root_path else render :new end end def update if @item.update(item_params) redirect_to action: :show else render :edit end end def destroy if @item.destroy redirect_to root_path else render :show end end private def item_params params.require(:item).permit(:name, :discription, :price, :category_id, :area_id, :condition_id, :delivery_fee_id, :ship_days_id, :image).merge(user_id: current_user.id) end def set_item @item = Item.find(params[:id]) end def prohibit_access redirect_to action: :show if @item.user_id != current_user.id end end
大変お手数おかけしますが、ご協力いただければ幸いでございます。
あなたの回答
tips
プレビュー