#解決策
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>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/08 02:20
2020/06/08 02:21
2020/06/08 02:28
2020/06/08 02:49
2020/06/08 03:00
2020/06/08 03:12