実現したいこと
APIでたたいたのをVueで表示させたい。
発生している問題・エラーメッセージ
[Rails+Vue.js]~Bookshelf~だけ表示される。 データが表示されない
該当のソースコード
やったこと
階層 ├── backend │ ├── app │ ├── bin │ ├── config │ ├── db │ ├── lib │ ├── log │ ├── public │ ├── storage │ ├── test │ ├── tmp │ └── vendor └── frontend └── vite-project
docker-compose run backend bundle exec rails g model Book title:string author:string publisher:string genre:string
app/models/book.rb
1class Book < ApplicationRecord 2 validates :title, presence: true, length: { maximum: 100 } 3 validates :author, presence: true, length: { maximum: 100 } 4 validates :publisher, presence: true, length: { maximum: 50 } 5 validates :genre, presence: true, length: { maximum: 50 } 6end 7
docker-compose run backend rails db:migrate
gem 'faker' gem 'rack-cors'
docker compose run backend bundle install docker-compose build
config/seeds.rb
120.times do 2 Book.create!( 3 title: Faker::Book.title, 4 author: Faker::Book.author, 5 publisher: Faker::Book.publisher, 6 genre: Faker::Book.genre 7 ) 8end
docker-compose run backend rails g controller api::books
config/routes.rb
1Rails.application.routes.draw do 2 namespace :api do 3 resources :books 4 end 5end
app/controllers/api/books_controller.rb
1 2class Api::BooksController < ApplicationController 3 def index 4 books = Book.all 5 6 render json: books 7 8 # 質問主さんの書き方の場合、フロント側はbooks.value = res.data.bookで受け取る 9 # render json: {book: books} 10 end 11 12 def show 13 book = Book.find(params[:id]) 14 render json: book 15 end 16end 17
cors.rb
1 Rails.application.config.middleware.insert_before 0, Rack::Cors do 2 allow do 3 origins "localhost:5173" 4 resource "*", 5 headers: :any, 6 methods: [:get, :post, :put, :patch, :delete, :options, :head] 7 end 8 end 9
frontend/vite
1 2import axios from 'axios' 3 4export default axios.create({ 5 baseURL: 'http://localhost:3000', 6})
main.ts
1import { createApp } from 'vue' 2import './style.css' 3import App from './App.vue' 4import router from './router' 5 6createApp(App).use(router).mount('#app')
package.json
1{ 2 "name": "vite-project", 3 "private": true, 4 "version": "0.0.0", 5 "type": "module", 6 "scripts": { 7 "dev": "vite", 8 "build": "vue-tsc && vite build", 9 "preview": "vite preview" 10 }, 11 "dependencies": { 12 "axios": "^1.4.0", 13 "bootstrap": "^5.3.1", 14 "vue": "^3.3.4", 15 "vue-class-component": "^7.2.6", 16 "vue-property-decorator": "^9.1.2", 17 "vue-router": "^4.2.4" 18 }, 19 "devDependencies": { 20 "@vitejs/plugin-vue": "^4.2.3", 21 "typescript": "^5.0.2", 22 "vite": "^4.4.5", 23 "vue-tsc": "^1.8.5" 24 } 25}
App.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 </div> 30 </div> 31 </div> 32 </div> 33 </div> 34</template> 35 36<script setup lang="ts"> 37import { ref, onMounted } from 'vue'; 38import axios from 'axios'; 39 40const bookInfo = ref({}); 41const bookInfoBool = ref(false); 42const books = ref([]); 43 44const fetchBooks = () => { 45 axios.get('/api/books').then( 46 (res) => { 47 books.value = res.data.books; 48 }, 49 (error) => { 50 console.log(error); 51 } 52 ); 53}; 54 55const setBookInfo = (id: number) => { 56 axios.get(`/api/books/${id}.json`).then((res) => { 57 bookInfo.value = res.data; 58 bookInfoBool.value = true; 59 }); 60}; 61 62onMounted(fetchBooks); 63</script> 64 65<style scoped></style> 66
ここに問題に対して試したことを記載してください。
いろいろパッケージをyarn addを使って入れてみた。よくわからず....
よろしくお願いします。
ここの部分の情報はありますか?
とかありましたら記載します。
環境は https://qiita.com/gabakugik/items/cded7e8aaa014025d8ba で作りました。
回答1件
あなたの回答
tips
プレビュー