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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Ruby

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1857閲覧

Railsで関連付ている値を一括で更新したい

kaji120

総合スコア39

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Ruby

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/09/06 10:27

編集2021/09/06 10:56

前提・実現したいこと

関連付をしているレコードを一括で更新したいと考えています。
createの時は同じようなやり方でうまくいっていたのですが、updateでは複数レコードを更新できずに困っています。
知恵をお貸しいただきたいです。よろしくお願いいたします。

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

api_1 | app/controllers/api/v1/posts_controller.rb:24:in `update' api_1 | Started PATCH "/api/v1/posts/16" for 172.29.0.1 at 2021-09-06 19:14:32 +0900 api_1 | Processing by Api::V1::PostsController#update as HTML api_1 | Parameters: {"post"=>{"post_items_attributes"=>[{"content"=>"テストをします", "status"=>false}]}, "id"=>"16"} api_1 | Post Load (0.4ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT $2 [["id", 16], ["LIMIT", 1]] api_1 | ↳ app/controllers/api/v1/posts_controller.rb:23:in `update' api_1 | PostItem Load (0.5ms) SELECT "post_items".* FROM "post_items" WHERE "post_items"."post_id" = $1 [["post_id", 16]] api_1 | ↳ app/controllers/api/v1/posts_controller.rb:24:in `update' api_1 | Completed 204 No Content in 29ms (ActiveRecord: 6.5ms | Allocations: 6231)

該当のソースコード

ruby

1class Api::V1::PostsController < ApplicationController 2 def index 3 posts = Post.all 4 render json: posts 5 end 6 7 def create 8 posts = Post.new(post_params) 9 if posts.save 10 render json: "OK", status: 200 11 else 12 render json: "EEEOR", status: 500 13 end 14 end 15 16 def show 17 post = Post.find(params[:id]) 18 content = post.post_items 19 render json: {"post": post, "content": content}, status: 200 20 end 21////////////////////////////////////////////////////////////////////////////////// 22 def update 23 post = Post.find(params[:id]) # 関連付けを行なっているpost.itemsを更新したい 24 post.post_items.update(content_params) 25 end 26 27////////////////////////////////////////////////////////////////////////////////// 28 29 def destroy 30 post = Post.find(params[:id]) 31 if post.destroy 32 render json: {}, status: "OK" 33 else 34 render json: {}, status: "ERROR" 35 end 36 end 37 38 private 39 #updateで使用するパラメーター 40 def content_params 41 params.require(:post).permit(post_items_attributes:[:id, :content, :status]) 42 end 43 44 def post_params 45 params.require(:post).permit(:title, :author, :image, post_items_attributes: [:id, :content, :status]) 46 end 47end 48

JavaScript

1 update (context) { 2 const list = context.state.todos.list 3 const bookId = context.state.book.selectedBook.id 4 const content = 5 list.map((item) => { 6 return { 7 content: item.content, 8 status: false 9 } 10 }) 11 this.$axios.$patch(url.POST_API + 'posts/' + bookId, { 12 post: { 13 post_items_attributes: content 14 } 15 }) 16 }

試したこと

・post_allを使用しましたが、モデル自体にしか使用できないため、関連付けを行なった値を更新できませんでした。

・Railsコンソールを使用してレコードの更新を一箇所行なったところ問題なくレコードが更新できました。

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

・Rails6
・Nuxt 2.15

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

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

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

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

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

guest

回答1

0

ベストアンサー

状況がはっきりしませんが、modelに

ruby

1class Post 2 has_many: :post_items 3end

が設定されていると仮定します。

二つ問題が見えます。

一つは、updateは単一のモデルに対してのメソッドです。Relationについて一括更新するのは、update_all です。

もう一つ、それ以前の問題として、そもそも該当recordが存在していない、というメッセージが出ていますね。

Completed 204 No Content

だから、リクエストした Post recordにつき、対応する PostItem recordsが一つも存在していないように見えます。データが存在していないならば、「更新」ができないのは当然ということになります。まず最初に create しなくてはなりません。なお、ここで「存在していない」とは、has_manyの関係においては、「PostItemとPostとを結びつけるjoin tableに該当recordが存在していない」という意味です。PostItem自体は存在しているかも知れないし、していないかも知れない。

この場合、id=16 だそうですから、bin/rails console などで、Post.find(16).post_items として出力すると確認できるでしょう。確認の方法の一つに過ぎませんが。

投稿2021/09/08 11:36

MasaSakano

総合スコア188

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問