前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー