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

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

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

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

Ruby on Rails

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

データ構造

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

解決済

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

ikutyan46
ikutyan46

総合スコア0

Ruby

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

Ruby on Rails

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

データ構造

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

1回答

0評価

0クリップ

904閲覧

投稿2020/06/08 02:09

編集2022/01/12 10:58

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

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

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

【コード】

schema

ActiveRecord::Schema.define(version: 2020_05_25_064157) do [省略] create_table "practices", force: :cascade do |t| t.string "practice_item" t.integer "practice_time" t.bigint "record_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["record_id"], name: "index_practices_on_record_id" end create_table "records", force: :cascade do |t| t.string "user_id" t.text "learning_point" t.date "training_date" t.datetime "created_at", null: false t.datetime "updated_at", null: false end [省略] end

index

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

edit

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

controller

def index @records = current_user.records.includes(:practices) maisumakunさん、ありがとうございます。 def edit @record = Record.find_by(id: params[:id]) end def update @record = Record.find_by(id: params[:id]) if @record.update(record_params) flash[:success] = "練習内容の更新が完了しました。" redirect_to records_url else flash[:alert] = "更新に失敗しました。" render :edit end end

model

#recordモデル class Record < ApplicationRecord validates :learning_point, presence: true validates :training_date, presence: true belongs_to :user has_many :outputs, dependent: :destroy has_many :practices, dependent: :destroy has_many :tasks, dependent: :destroy # recordとpracticeは、親・子関係 # has_many :practices accepts_nested_attributes_for :outputs accepts_nested_attributes_for :practices #belong to :users, through :practices # has_many :tasks accepts_nested_attributes_for :tasks #belongs to :users, through :tasks end

model

#practiceモデル class Practice < ApplicationRecord validates :practice_item, presence: true validates :practice_time, presence: true belongs_to :record # has_many :users, through: :records end

#追記
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>

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Ruby

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

Ruby on Rails

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

データ構造

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