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

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

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

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

1回答

961閲覧

accept_nested_attributes_for を使用した、データの一括更新の方法がわかりません。

yukuri0313

総合スコア0

Ruby on Rails 6

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

0グッド

0クリップ

投稿2021/08/21 07:50

編集2021/08/21 08:02

accept_nested_attributes_for を使用した、データの一括更新

Ruby on RailsにてTodoアプリを作成中。カテゴリモデルとTodoモデルの親子関係で作成しています。

発生している問題・エラーメッセージ

edit.html.erbで入力した値をtodoescontrollerのupdateアクションで受け取り、レコードの一括更新を行いたい。しかし、edit.html.erbでから値を送信すると、入力内容が新規レコードとしてデータベースに保存され、レコードの数が等比的に増えていってしまいます。

該当のソースコード

Ruby on Rails 6.1.4

#Category.rb class Category < ApplicationRecord has_many :todos accepts_nested_attributes_for :todos, reject_if: :all_blank, allow_destroy: true end
#TodoesController class TodoesController < ApplicationController before_action :set_current_user def new @category = Category.new 4.times { @category.todos.build } end def create @category = Category.new( category_params, ) @category.save redirect_to("/categories/index") end def edit @category = Category.new @category.todos.build @category_name = Category.find(params[:id]) @todoes = Todo.where(category_id: @category_name.id) end def update @category = Category.where(params[:id]) @category.update(update_category_params) redirect_to("/categories/index") end private def category_params params.require(:category).permit(:kind, todos_attributes: [:id, :title, :content, :deadline, :_destroy]) end def update_category_params params.require(:category).permit(:kind, todos_attributes: [:id, :title, :content, :deadline, :category_id, :_destroy]) end end
<%= form_for @category, url: "/todoes/#{@category_name.id}/update" do |f| %> <%= f.label "カテゴリー名"%> <%= f.text_field :kind, value: @category_name.kind %> <ul> <% @todoes.each do |todo| %> <%= f.fields_for :todos do |todos_form| %> <li> <%= todos_form.label "タイトル" %> <%= todos_form.text_field :title, value: todo.title %> <%= todos_form.label "詳細" %> <%= todos_form.text_field :content, value: todo.content %> <%= todos_form.label "締め切り" %> <%= todos_form.text_field :deadline, value: todo.deadline %> </li> <% end %> <% end %> </ul> <%= f.submit "Update Tasks" %> <% end %>

試したこと

Qiitaなどで調べた結果、allow_destoryと:_destroyを有効にする、update_onlyを親クラスに記述するなどの解決案が見つかりましたが、結果変わらずといった形です。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

form_forのインスタンス(@category)が空なんで、新規登録されているんだと思います。

form_forやform_withではインスタンスの中身によって自動でcreateかupdateに転送されます。

なので、正しく記載されていればurlの記述は不要です。

投稿2021/08/22 12:47

J_O

総合スコア143

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

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

yukuri0313

2021/08/26 05:26

editアクションで@category=Category.find(params[:id])と変更してみたところ、todoの出力数が倍増してしまいました。また、update時に新規登録になってしまう点も修正が効きませんでした。現状どのようなエラーが発生しているのでしょうか。
J_O

2021/08/26 12:34

viewで <% @todoes.each do |todo| %> eachで回している理由ってなんでしょうか。 @categoryに紐づいているtodosを表示させるだけならeachは必要ないような気がするんですが。 恐らくここが原因でだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問