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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

543閲覧

複数テーブル同時登録はできた editで既に登録した値を更新できない

annaPanda

総合スコア130

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2020/04/01 16:28

まず、newの様子ですが、以下です。これは自体は問題ありません。
イメージ説明

app/models/sales_drink.rb

belongs_to :sale belongs_to :drink

app/models/sale.rb

has_many :drinks, through: :sales_drinks has_many :sales_drinks accepts_nested_attributes_for :sales_drinks

app/models/drink.rb

has_many :sales, through: :sales_drinks has_many :sales_drinds

app/views/sales/new.html.haml

= @reservation.guest = @reservation.room.name = @reservation.kaiseki.name = form_with model: [@sale], local: true do |f| = f.hidden_field :reservation_id, value: @reservation.id = f.number_field :from .aaa{data: {length: @drinks.length}} = f.fields_for :sales_drinks do |c| .sales__drink{data: {num: 0}, id: "sales__drink0"} -# = @drinks[0].name = c.hidden_field :drink_id, value: 1 = c.number_field :number, value: 0 = f.submit "保存", name: "ボタン" = f.submit "会計", name: "ボタン" - @drinks.each_with_index do |d, i| %div{id: "drink-#{i}", data: {name: d.name}}

app/controllers/sales_controller.rb

class SalesController < ApplicationController before_action :signed_in? before_action :submit_branch, only: :create #省略 def new redirect_to root_path if params[:format].nil? @reservation = Reservation.find(params[:format]) if params[:format].present? @sale = Sale.new @sale.sales_drinks.build @drinks = Drink.all end def create @sale = Sale.new(sale_params) if @sale.save! redirect_to reservations_path else render :new end end #省略 private def signed_in? redirect_to root_path unless member_signed_in? end def submit_branch case params["ボタン"] when "保存" then params[:from] == nil def sale_params params.require(:sale).permit(:mean, :from, :reservation_id, sales_drinks_attributes: [:drink_id, :number]).merge(member_id: current_member.id) end when "会計" then params[:status] == 2 def sale_params params.require(:sale).permit(:mean, :from, :reservation_id, sales_drinks_attributes: [:drink_id, :number]).merge(status: 2, member_id: current_member.id) end end end #省略 end

app/assets/javascripts/sales.js

$(function () { let drink_forms = ""; let idLength = $(".aaa")[0].dataset.length for (i = 1; i < idLength; i++){ drinkName = $(`#drink-${i}`)[0].dataset.name drink_forms = drink_forms + `<div class="sales__drink" data-num="${i}" id="sales__drink${i}">${drinkName}</div> <input type="hidden" class="bbb", name="sale[sales_drinks_attributes][${i}][drink_id]" id="sale_sales_drinks_attributes_${i}_drink_id", value="${i+1}"> <input type="number" name="sale[sales_drinks_attributes][${i}][number]" id="sale_sales_drinks_attributes_${i}_number", value=0>` } $(".aaa").append(drink_forms) for (i = 0; i < idLength; i++) { $(`#sales__drink${i}`).click(function () { dataNum = $(this)[0].dataset.num $(`#sale_sales_drinks_attributes_${dataNum}_number`)[0].value = Number($(`#sale_sales_drinks_attributes_${dataNum}_number`)[0].value) + 1 }) } })

イメージ説明
これで緑で囲んでいる部分をクリックするとその直下の数字が増えて、保存ボタンを押せばドリンク情報は他テーブルに保存されます。
これをeditで、全く同じ見た目でドリンク情報を引き出して更新したいです。

app/views/sales/edit.html.haml

= @reservation.guest = @reservation.room.name = @reservation.kaiseki.name = form_with model: [@sale], local: true do |f| = f.hidden_field :reservation_id, value: @reservation.id = f.number_field :from .edit_aaa{data: {length: @drinks.length}} = f.fields_for :sales_drinks do |c| -# .sales__drink{data: {num: 0}, id: "sales__drink0"} = c.number_field :drink_id = c.number_field :number = f.submit "保存", name: "ボタン" = f.submit "会計", name: "ボタン" - @drinks.each_with_index do |d, i| %div{id: "drink-#{i}", data: {name: d.name}}

app/controllers/sales_controller.rb

class SalesController < ApplicationController before_action :signed_in? #省略 def edit @sale = Sale.find(params[:id]) @sale.sales_drinks.build @reservation = Reservation.find(@sale.reservation_id) @drinks = Drink.all end def update @sale = Sale.find(params[:id]) if @sale.update!(edit_sale_params) redirect_to reservations_path else render :edit end end private #省略 def edit_sale_params params.require(:sale).permit(:mean, :from, :reservation_id, sales_drinks_attributes: [:drink_id, :number]).merge(member_id: current_member.id) end end

これだと
イメージ説明
こんな感じになってしまいます。
※hidden_fieldをnumber_fieldにして表示させてます。

①ボタンの加え方がわからないです。
②なぜがfieldが1組増えているのかわからないです。。
③この増えた1組に値を入れて(データベースがnull:falseになっててエラーになってしまうので)、保存すると、更新されずに別に保存されてしまいます。

どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

一度全て削除して、新たに登録する方法をとりました。

投稿2020/04/03 12:09

annaPanda

総合スコア130

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問