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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

642閲覧

複数商品購入の自動計算の実装

takuya-siro

総合スコア3

Ruby on Rails 6

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2023/01/17 13:27

編集2023/01/18 14:31

前提

ruby on railsで商品発注システムを作成しており、現在は商品購入画面の実装を行なっています。
複数の商品を同時購入できる事を理想としています。商品購入画面で表示される商品はユーザーがお気に入りした商品のみが表示される様に限定しております。

下記が現在の実装のスクショとなります。
イメージ説明

実現したいこと

・商品毎の数量の欄に注文数量を入力すると、商品価格x数量が小計に自動表示されること。

・全ての小計の合計が合計の欄に表示されること。

上記の二つを現在の目標としております。

発生している問題・エラーメッセージ

問題
「商品の数量を上から順番に入力した場合のみ理想的な動作が行われること」

解決したい点
「数量を入力し直したり、下から上に戻り入力しても理想的な動作が行われること」

現在の挙動(上から順番に入力した場合)
https://gyazo.com/b8b3dc3edea6306df8c0a61d54fa09fb

現在のエラー挙動(数量再入力)
イメージ説明

該当コード

new.html.erb

1<div class="cart-form-content"> 2 <%= form_for(@cart, url: carts_path, method: :post) do |f| %> 3 <div class="order-form-content"> 4 <% if @favorite_list.present? %> 5 <% @favorite_list.each do |item| %> 6 <% @num = @num + 1 %> 7 <div class='item-img-content'> 8 <%= image_tag item.image, class: "item-index-img" if item.image.attached? %> 9 </div> 10 <div class='item-name-content' > 11 <%= item.name %> 12 </div> 13 <div class='item-price-content'> 14 <span id='item-price-id-<%= @num%>'><%= item.price %></span>円 15 </div> 16 <div class="order-form"> 17 <%= f.fields_for :orders do |f| %> 18 <div class="order-item-id-form"> 19 <%= f.text_field :item_id, value: item.id, disabled: true %> 20 </div> 21 <div class="order-quanty-form"> 22 数量 23 <%= f.text_field :quanty, id:"order-quanty-#{@num}" %> 24 </div> 25 <div class="order-price"> 26 小計 27 <span id='order-price-output-<%= @num%>'></span> 28 </div> 29 <% end %> 30 </div> 31 <% end %> 32 <% end %> 33 <div class="total-price"> 34 合計 35 <%= f.text_field :price, id:"cart-price" %> 36 <div> 37 <div class="cart-form-btn"> 38 <%= f.submit '登録', class: 'btn btn-primary' %> 39 </div> 40 </div> 41 <% end %> 42</div>

order_price.js

1window.addEventListener('DOMContentLoaded', function() { 2 let i = 0; 3 sum = 0; 4 do { 5 i+=1; 6 const itemPrice = document.getElementById(`item-price-id-${i}`).innerHTML; 7 const orderQuanty = document.getElementById(`order-quanty-${i}`); 8 const numOutput = i; 9 orderQuanty.addEventListener("input", function() { 10 if (numOutput == 1) { 11 sum = 0; 12 }; 13 const orderQuantyValue = orderQuanty.value; 14 const orderPrice = orderQuantyValue * itemPrice; 15 document.getElementById(`order-price-output-${numOutput}`).textContent = orderPrice; 16 sum = sum + orderPrice; 17 console.log(sum); 18 const cartPrice = document.getElementById(`cart-price`); 19 cartPrice.value = sum; 20 }); 21 } while (i<4); 22});

試したこと

JavaScriptの呼び出しの為に変数iをループ処理することでお気に入りした商品を取得している為、再入力した際に無限に数字が足され続けることは理解しておりますが、その解決方法が分からない為、ご教授いただきたいです。
試したこととしては、1回目のループの際は合計数値を0する様にsum=0を追記致しました。

補足情報(FW/ツールのバージョンなど)

学習中な為、言語化が上手くできず申し訳ありません。その他必要情報等ありましたら追記致しますのでコメント頂けますと幸いです。

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

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

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

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

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

no1knows

2023/01/18 00:51

画像やGIFはリンクではなく、直接貼り付けてください。リンクは時間が立つとあとから見れなくなります。 その結果、将来、同じ問題を抱えた人がこの質問に辿りついても、内容が理解ができなくなってしまうためです。
takuya-siro

2023/01/18 14:33

コメント頂きありがとうございます。画像とGIFを直接の貼り付けに変更致しました。
guest

回答1

0

ベストアンサー

querySelectorAll()を利用して、下記の流れで実装するのがシンプルで良い気がします。

  1. すべての数量に同じクラスを追加
  2. すべての小計に同じクラスを追加
  3. 数量が入力されたら小計を計算してから、合計を計算する

参考:フォームが入力されたタイミングで処理を実行する

※Turbolinksを利用しているなら、そちらも含めて記述する必要があります。

投稿2023/01/18 00:48

編集2023/01/19 10:15
no1knows

総合スコア3365

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

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

takuya-siro

2023/01/18 14:34

ご回答いただきありがとうございます。頂いた回答を元に一度、試行致します。
no1knows

2023/01/18 18:22

はい!わからないところがあればコメントいただければと思います!
takuya-siro

2023/01/23 12:39 編集

コメントありがとうございます。一つ質問がありまして、フォームが入力された際の値(value)の取得はどのように行えばよろしいでしょうか? 現在は下記の様なコードで実装をしているのですが、数量が入力された時の値(value)が取得できません。 const orderQuantyValue = orderQuantity[i].value;こちらの行で任意の値(value)を取得することを想定しております。 ```order_price.js window.addEventListener('DOMContentLoaded', function() { const itemPrices = document.querySelectorAll('.item-order-price'); const orderQuantity = document.querySelectorAll('.order-quanty-form'); orderQuantity.forEach(function(quantity) { quantity.addEventListener("input", function() { for (let i = 0; i < itemPrices.length; i++) { const itemPriceValue = itemPrices[i].innerHTML; const orderQuantyValue = orderQuantity[i].value; const orderPrice = itemPriceValue * orderQuantyValue console.log(orderPrice); i+= 1; }; }); }); }); ```
no1knows

2023/01/24 00:44 編集

下記のような形です! <p>ラテ</p> <input type="number"></input> <p data-price="100" class="sum"></p> <p>ケーキ</p> <input type="number"></input> <p data-price="200" class="sum"></p> <p>ナポリタン</p> <input type="number"></input> <p data-price="300" class="sum"></p> <p class="total"></p> <script> window.addEventListener('DOMContentLoaded', function () { const inputs = document.querySelectorAll('input'); inputs.forEach(function (input) { input.addEventListener("input", function () { console.log('入力したね!') // 小計を計算して反映させる // 上記ではdata属性を使って単価を登録しているが、ここはお好きに // 参考: https://into-the-program.com/dataset/ // querySelectorAllで小計をすべて取得し合計を計算して反映させる const prices = document.querySelectorAll('sum'); }) }) }) </script>
takuya-siro

2023/01/28 09:41

色々教えて頂き誠にありがとうございます。無事解決し、理想の形に実装できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問