質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

1420閲覧

購入された商品を区別したい

ryuya1204

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/10/06 12:18

編集2020/10/06 12:26

行いたいこと

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

大変お手数おかけしますが、ご協力いただければ幸いでございます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gouf

2020/10/06 13:23

「購入した商品は再度購入できないような仕組み」、対象は誰でしょうか、ログインしている人? 購入したひと全員?
ryuya1204

2020/10/06 13:41

ご回答いただきありがとうございます! 一度購入した商品は、全員が再度その商品を購入できないような仕組みを考えております。 お手数おかけしますがご確認よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問