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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

338閲覧

Editがうまくいかない

gabakugik

総合スコア13

Vue.js

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2023/09/29 17:30

編集2023/10/01 13:24

実現したいこと

editができない。
axios.putがうまくできない
本の情報を変更ボタンが作動しない
本を更新できるようにしたい。

エラー内容

app/controllers/api/books_controller.rb:26:in `update' backend_1 | Unpermitted parameter: :id. Context: { controller: Api::BooksController, action: update, request: #<ActionDispatch::Request:0x00007fa97bb01b80>, params: {"book"=>{"id"=>4, "title"=>"Everything is Illuminated", "author"=>"Jerold Prosacco", "publisher"=>"Fairview Press", "genre"=>"Essay"}, "controller"=>"api/books", "action"=>"update", "id"=>"4"} Completed 500 Internal Server Error in 3ms (ActiveRecord: 0.3ms | Allocations: 3066)

該当のソースコード

vuerouter

1import { createRouter, createWebHistory } from 'vue-router' 2import Home from '@/views/Home.vue' 3 4export default createRouter({ 5 history: createWebHistory(), 6 routes: [ 7 { 8 path: '/', 9 component: Home, 10 }, 11 { 12 path: '/create', 13 component: () => import('@/views/Create.vue'), 14 }, 15 { 16 path: '/edit/:id', 17 component: () => import('@/views/BookEdit.vue'), 18 }, 19 ],

Home.vue

1<template> 2 <div class="container"> 3 <h1 class="#f3e5f5 purple lighten-5 center">[Rails+Vue.js]~Bookshelf~</h1> 4 <div class="row #e3f2fd blue lighten-5"> 5 <div class="col s4 m6" v-for="book in books" :key="book.id"> 6 <div class="card btn"> 7 <span class="card-title" @click="setBookInfo(book.id)"> 8 {{ book.title }} 9 </span> 10 </div> 11 </div> 12 </div> 13 <div class="row" v-show="bookInfoBool"> 14 <div class="col s12 m12"> 15 <div class="card blue-grey darken-1"> 16 <div class="card-content white-text"> 17 <span class="card-title"> 18 【{{ bookInfo.title }}】 19 </span> 20 <div class="detail"> 21 ・著者:{{ bookInfo.author }} 22 </div> 23 <div class="detail"> 24 ・出版社:{{ bookInfo.publisher }} 25 </div> 26 <div class="detail"> 27 ・ジャンル:{{ bookInfo.genre }} 28 </div> 29<router-link :to="{ path: `/edit/${bookInfo.id}` }" class="btn">本の編集</router-link> 30 </div> 31 </div> 32 </div> 33 </div> 34 </div> 35</template> 36 37<script setup lang="ts"> 38import { ref, onMounted } from 'vue'; 39import axios from 'axios'; 40 41const bookInfo = ref({}); 42const bookInfoBool = ref(false); 43const books = ref([]); 44 45const fetchBooks = () => { 46 axios.get('http://localhost:3000/api/books').then( 47 (res) => { 48 books.value = res.data; 49 }, 50 (error) => { 51 console.log(error); 52 } 53 ); 54}; 55 56const setBookInfo = (id: number) => { 57 axios.get(`http://localhost:3000/api/books/${id}.json`).then((res) => { 58 bookInfo.value = res.data; 59 bookInfoBool.value = true; 60 }); 61}; 62 63onMounted(fetchBooks); 64</script> 65 66<style scoped></style>

BookEdit.vue

1<template> 2 <div class="container"> 3 <h1 class="f3e5f5 purple lighten-5 center">本の編集</h1> 4 <form class="col s12"> 5 <div class="row"> 6 <div class="input-field"> 7 <input placeholder="Title" type="text" class="validate" v-model="book.title" required /> 8 </div> 9 </div> 10 <div class="row"> 11 <div class="input-field"> 12 <input placeholder="Author" type="text" class="validate" v-model="book.author" required /> 13 </div> 14 </div> 15 <div class="row"> 16 <div class="input-field"> 17 <input placeholder="Publisher" type="text" class="validate" v-model="book.publisher" required /> 18 </div> 19 </div> 20 <div class="row"> 21 <div class="input-field"> 22 <input placeholder="Genre" type="text" class="validate" v-model="book.genre" required /> 23 </div> 24 </div> 25 <div class="btn" @click="updateBook(book.id)">本の情報を変更</div> ←これが機能していない。 26 </form> 27 </div> 28</template> 29 30<script lang="ts"> 31import { defineComponent } from 'vue'; 32import axios from 'axios'; 33 34interface Book { 35 id: string; 36 title: string; 37 author: string; 38 publisher: string; 39 genre: string; 40} 41 42export default defineComponent({ 43 name: 'BookEdit', 44 data() { 45 return { 46 id: this.$route.params.id, 47 book: { 48 id: '', 49 title: '', 50 author: '', 51 publisher: '', 52 genre: '', 53 } as Book, 54 }; 55 }, 56 mounted() { 57 this.setBookEdit(this.id); 58 }, 59 methods: { 60 async setBookEdit(id: string) { 61 try { 62 const response = await axios.get<Book>(`http://localhost:3000/api/books/${id}.json`); 63 const data = response.data; 64 this.book.id = data.id; 65 this.book.title = data.title; 66 this.book.author = data.author; 67 this.book.publisher = data.publisher; 68 this.book.genre = data.genre; 69 } catch (error) { 70 console.error(error); 71 } 72 }, 73 async updateBook(id: string) { 74 if (!this.book.title) return; 75 try { 76 await axios.put(`http://localhost:3000/api/books/${id}`, { book: this.book }); 77 this.$router.push({ path: '/' }); 78 } catch (error) { 79 console.error(error); 80 } 81 }, 82 }, 83}); 84</script> 85 86<style scoped></style>

app/controllers/api/books_controller.rb

1 2class Api::BooksController < ApplicationController 3 4 def index 5 books = Book.all 6 7 render json: books 8 9 # render json: {book: books} 10 end 11 12 def show 13 book = Book.find(params[:id]) 14 render json: book 15 end 16 17 def create 18 @book = Book.new(book_params) 19 if @book.save 20 head :no_content 21 else 22 render json: @book.errors, status: :unprocessable_entity 23 end 24 end 25 26 def update 27 @book = Book.find(params[:id]) 28 if @book.update(book_params) 29 render json: @book 30 else 31 render json: @book.errors, status: :unprocessable_entity 32 end 33 end 34 35 36 37 def book_params 38 params.fetch(:book, {}).permit( 39 :title, :author, :publisher, :genre 40 ) 41 end 42end 43

ほかに情報がこの情報がほしいとかありましたら記載するのでよろしくお願いします

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

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

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

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

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

guest

回答1

0

自己解決

def update
@book = Book.find(params[:id])
if @book.update(book_params)
render json: @book
else
render json: @book.errors, status: :unprocessable_entity
end
end
でupdateできました。

投稿2023/10/01 13:26

gabakugik

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問