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

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

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

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

Nuxt.js

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

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Ruby on Rails

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

JavaScript

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

Q&A

解決済

1回答

893閲覧

updateを行うと新しいデータと古いデータが二重に保存されてしまう

kaji120

総合スコア39

Vue.js

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

Nuxt.js

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

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Ruby on Rails

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

JavaScript

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

1グッド

1クリップ

投稿2021/09/09 03:57

編集2021/09/09 08:04

前提・実現したいこと

RailsとNuxtを使用してupdateアクションを実装しています。
更新自体にエラーは出ないのですが、更新をすると編集前のデータと新しいデータが両方保存されてしまいます。

該当のソースコード

controller

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(create_params) 9 if posts.save 10 render json: posts, status: :created 11 else 12 ender json: { errors: post.errors.full_messages }, status: :internal_server_error 13 end 14 end 15 16 def show 17 content = post.post_items 18 render json: {"post": post, "content": content}, status: :ok 19 end 20#今回対象 21////////////////////////////////////////////////////////////////////// 22#updateを実行すると新旧のデータが保存されてしまう 23#accepts_nested_attributes_forを使用 24 def update 25 if post.update(update_params) 26 head :ok 27 else 28 render json: { errors: post.errors.full_messages }, status: :internal_server_error 29 end 30 end 31 32////////////////////////////////////////////////////////////////////// 33 34 def destroy 35 if post.destroy 36 render json: {}, status: :ok 37 else 38 render json: {}, status: :internal_server_error 39 end 40 end 41 42 private 43 def post 44 @post ||= Post.find(params[:id]) 45 end 46 47 def post_item_params 48 [:id, :content, :status] 49 end 50 51 52 def update_params 53 params.require(:post).permit(post_items_attributes: post_item_params) 54 end 55 56 def create_params 57 params.require(:post).permit(:title, :author, :image, post_items_attributes: post_item_params) 58 end 59end 60

model

Ruby

1class Post < ApplicationRecord 2 has_many :post_items, dependent: :destroy 3 accepts_nested_attributes_for :post_items, allow_destroy: true 4 5 validates :title, presence: true 6 validates :author, presence: true 7 validates :image, presence: true 8end 9

store

JavaScript

1import * as url from './constants/url' 2 3export const actions = { 4 // ユーザーが選択した本をサーバーに送る 5 post (context) { 6 const list = context.state.todos.list 7 const selectedBook = context.state.book.selectedBook 8 9 // サーバーに送る配列を作成 10 const postItemsAttributes = 11 list.map((item) => { 12 return { 13 content: item.content, 14 status: item.status 15 } 16 }) 17 18 // plugin/bookInfo $title,$author,$image 19 this.$axios.$post(url.POST_API + 'posts', { 20 post: { 21 title: this.$title(selectedBook), 22 author: this.$author(selectedBook), 23 image: this.$image(selectedBook), 24 post_items_attributes: postItemsAttributes 25 } 26 }) 27 .then((responseBook) => { 28 context.commit('book/userBook', responseBook) 29 context.commit('book/clearBook') 30 context.commit('todos/clear') 31 }) 32 }, 33 get (commit) { 34 this.$axios.$get(url.POST_API + 'posts') 35 .then((response) => { 36 commit('registerdBook', response) 37 }) 38 }, 39 40 // 本を削除 41 delete (context) { 42 const bookId = context.state.book.selectedBook.id 43 this.$axios.$delete(url.POST_API + 'posts/' + bookId) 44 }, 45 46 // 更新 今回対象 47/////////////////////////////////////////////////////////////////////// 48 update (context) { 49 50 // 編集データのリストを取得 51 const list = context.state.todos.list 52 53//送り先ID 54 const selectedBook = context.state.book.selectedBook 55 56// 編集したデータをmapで取り出し 57 const postItemsAttributes = 58 list.map((item) => { 59 return { 60 content: item.content, 61 status: false 62 } 63 }) 64 this.$axios.$patch(url.POST_API + 'posts/' + selectedBook.id, { 65 post: { 66 post_items_attributes: postItemsAttributes 67 } 68 }) 69 } 70/////////////////////////////////////////////////////////////////////// 71 72} 73

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

Nuxt 2.15
Rails 6

shinoharat👍を押しています

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

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

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

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

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

shinoharat

2021/09/09 06:14

該当部分の view や controller のコードを質問文に追加してください。
guest

回答1

0

ベストアンサー

原因

送信データを生成するとき、id を指定していないため、Rails がすべて新規データと判断しているんだと思います。

js

1 const postItemsAttributes = 2 list.map((item) => { 3 return { 4 content: item.content, 5 status: false 6 } 7 })

修正案

list に post_items の id が含まれているなら、

diff

1 return { 2+ id: item.id, 3 content: item.content, 4 status: false 5 }

のように変更すれば上手くいきそうな気がします。
新規データの場合は item.id が null か空文字にすれば Rails が良しなに解釈してくれたはずです。

記憶を頼りに書いているので、間違っていたらすみません。
曖昧な回答ですみませんが、参考になれば幸いです。

投稿2021/09/09 09:56

shinoharat

総合スコア1685

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問