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

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

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

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

Ruby on Rails

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

1回答

1656閲覧

【Rails】実質1つのidなのにeditで変更した分が全て表示されてしまう

ikutyan46

総合スコア18

Ruby

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

Ruby on Rails

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2020/06/08 02:09

編集2020/06/08 03:17

#解決策
record_params.permit内に、関連付けしている子テーブルの[:id]を入れることで解決。

#子テーブル_attributes:[属性]の「属性」に「:id」を付与した。 def record_params params.require(:record).permit(:record_id, :training_date, :learning_point, outputs_attributes:[:output_name, :id], practices_attributes:[:practice_item, :practice_time, :id], tasks_attributes:[:task_name, :id]).merge(user_id: current_user.id) end

#元々の質問

【実現したいこと】
createで登録したデータを、1つずつテーブルに表示させたい
そのテーブルには、同じ行で、親テーブルの属性と子テーブルの属性の両方を表示させたい

【現状】
eachメソッドを2回使い、親・子テーブルの属性を表示できたが、editで変更した分がそのままテーブルに表示されてしまう(=実質1つのidなのにeditで変更した分が全て表示されてしまう)

こちらの解決方法や、なぜ添付画像のような挙動になってしまうのか、
ご教示頂けますと幸いです。

【コード】

schema

1ActiveRecord::Schema.define(version: 2020_05_25_064157) do 2[省略] 3 create_table "practices", force: :cascade do |t| 4 t.string "practice_item" 5 t.integer "practice_time" 6 t.bigint "record_id" 7 t.datetime "created_at", null: false 8 t.datetime "updated_at", null: false 9 t.index ["record_id"], name: "index_practices_on_record_id" 10 end 11 12 create_table "records", force: :cascade do |t| 13 t.string "user_id" 14 t.text "learning_point" 15 t.date "training_date" 16 t.datetime "created_at", null: false 17 t.datetime "updated_at", null: false 18 end 19[省略] 20end

index

1table.table-hover.table-respnsive 2 thead 3 tr 4 th 練習日 5 th 総練習時間 6 th 7 th 8 tbody 9 - @records.each do |record| 10 - record.practices.each do |practice| 11 tr 12 td= link_to record.training_date, record_path(record) 13 td= practice.practice_time 14 td 15 = link_to '編集する', edit_record_path(record), class: 'btn btn-primary mr-3' 16 = link_to '削除する', record_path(record), method: :delete, data: { confirm: "練習記録を削除します。よろしいですか?" }, class: 'btn btn-danger'

edit

1h1 練習記録の編集 2= form_with model:@record, url: record_path(@record.id), local:true do |f| 3 h3 練習日 4 = f.date_field :training_date 5 6 h3 今日できるようになったこと・成果 7 = f.fields_for :outputs do |output_fields| 8 .form-group 9 = output_fields.text_field :output_name, class: 'form-control', id: 'output_name' 10 11 .d-flex.text-item: center 12 = f.fields_for :practices do |practice_fields| 13 h3 今日の練習内容 14 = practice_fields.select :practice_item, class: 'form-control' 15 option 3球目攻撃 16 option フォア2本、バック2本 17 h3 を 18 = practice_fields.number_field :practice_time 19 h3 分 20 21 h3 今日の気付き 22 = f.text_area :learning_point 23 24 = f.fields_for :tasks do |task_fields| 25 h3 次回練習すること・課題 26 = task_fields.text_field :task_name 27 28 = f.submit 'この内容で更新する', class: 'btn btn-primary' 29 = link_to '一覧に戻る', root_path, class: 'btn btn-primary'

controller

1 def index 2 @records = current_user.records.includes(:practices) 3maisumakunさん、ありがとうございます。 4 5 def edit 6 @record = Record.find_by(id: params[:id]) 7 end 8 9 def update 10 @record = Record.find_by(id: params[:id]) 11 if @record.update(record_params) 12 flash[:success] = "練習内容の更新が完了しました。" 13 redirect_to records_url 14 else 15 flash[:alert] = "更新に失敗しました。" 16 render :edit 17 end 18 end 19

model

1#recordモデル 2class Record < ApplicationRecord 3 validates :learning_point, presence: true 4 validates :training_date, presence: true 5 belongs_to :user 6 has_many :outputs, dependent: :destroy 7 has_many :practices, dependent: :destroy 8 has_many :tasks, dependent: :destroy 9 # recordとpracticeは、親・子関係 10 # has_many :practices 11 accepts_nested_attributes_for :outputs 12 accepts_nested_attributes_for :practices 13 #belong to :users, through :practices 14 # has_many :tasks 15 accepts_nested_attributes_for :tasks 16 #belongs to :users, through :tasks 17end

model

1#practiceモデル 2class Practice < ApplicationRecord 3 validates :practice_item, presence: true 4 validates :practice_time, presence: true 5 belongs_to :record 6 # has_many :users, through: :records 7end

#追記
createアクションした時のparamsの中身(適当に値を入れました)

[1] pry(#<RecordsController>)> params => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"iOBP9oCqOf6KoC5OjUWNg2UCPYiEfq9uMhXN6DHVzy5LtadftUmIzqBhwV8YgufEsW9DwIn2+RWBYaXcQDyChg==", "record"=><ActionController::Parameters {"training_date"=>"2020-06-08", "outputs_attributes"=>{"0"=>{"output_name"=>"ffff"}}, "practices_attributes"=>{"0"=>{"practice_item"=>"3球目攻撃", "practice_time"=>"111"}}, "learning_point"=>"123", "tasks_attributes"=>{"0"=>{"task_name"=>"333"}}} permitted: false>, "commit"=>"この内容で登録する", "controller"=>"records", "action"=>"create"} permitted: false>

次に、先ほどのテストで登録したものに対してupdateしたparamsの中身

[1] pry(#<RecordsController>)> params => <ActionController::Parameters {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"3AG1peGKVPxuhUBdHfKGgIoGlxESmAdedft4JpduigL+8hPUw1Il9uUEeTW+vlNZBH74jHRURyMr3zcXCmUJHw==", "record"=><ActionController::Parameters {"training_date"=>"2020-06-08", "outputs_attributes"=>{"0"=>{"output_name"=>"テスト用で直し", "id"=>"77"}}, "practices_attributes"=>{"0"=>{"practice_item"=>"3球目攻撃", "practice_time"=>"300", "id"=>"77"}}, "learning_point"=>"頑張った。", "tasks_attributes"=>{"0"=>{"task_name"=>"問題解決したい", "id"=>"77"}}} permitted: false>, "commit"=>"この内容で更新する", "controller"=>"records", "action"=>"update", "id"=>"52"} permitted: false>

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

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

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

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

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

guest

回答1

0

ベストアンサー

実質1つのidなのにeditで変更した分が全て表示されてしまう

編集の際に、子テーブル側のID与え忘れなどで、列が追加登録になってしまっている可能性はないですか?

updateアクションが示されていないので判断が付きませんが)

投稿2020/06/08 02:12

maisumakun

総合スコア145123

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

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

ikutyan46

2020/06/08 02:20

maisumakunさん、ありがとうございます。 Controllerのupdate、editアクションと、Modelを追加しました。 ID与え忘れ、はどこで判断したらよろしいでしょうか? 初歩的な質問で申し訳ございません。
maisumakun

2020/06/08 02:21

record_paramsの中身はどのようなものですか? (strong parameterで必要なものを正しく拾えているかもチェックの必要があります)
ikutyan46

2020/06/08 02:28

「binding.pry」を使って確認できそうなので、gem入れて確認してみます。 15分ほどお待ち頂けますでしょうか?
ikutyan46

2020/06/08 02:49

先ほど追記しました。見た限り、拾えているように見えますが、ログを見ると、 Unpermitted parameter: :id Unpermitted parameter: :id Unpermitted parameter: :id がありました。これが何か肝になっている気がします。
maisumakun

2020/06/08 03:00

> これが何か肝になっている気がします。 メッセージのとおりですね。idをpermitできていません。
ikutyan46

2020/06/08 03:12

permit()内に、outputs_attributes:[:output_name, :id]というように、子テーブルに、attributes: [ :id]を付与することで、解決できました! ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問