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

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

ただいまの
回答率

87.48%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 540

score 126

まず、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になっててエラーになってしまうので)、保存すると、更新されずに別に保存されてしまいます。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る