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

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

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

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

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Docker

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

Ruby on Rails 7

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

Q&A

解決済

1回答

1138閲覧

Vueでrails apiのデータを表示させたい

gabakugik

総合スコア13

Vue.js

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

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Docker

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

Ruby on Rails 7

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

0グッド

0クリップ

投稿2023/09/02 12:45

編集2023/09/06 16:29

実現したいこと

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 で作りました。

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

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

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

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

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

amaranthine

2023/09/05 00:11

「Web上には表示されない」というのは、画面は一応出るが、データが表示されないということなのか、真っ白か、ブラウザによる404画面なのか、ブラウザ上、どういう画面か情報があれば、よりわかりやすいかもです。
gabakugik

2023/09/06 16:24

画面は一応出るが、データが表示されないです。
guest

回答1

0

ベストアンサー

提示されている手順とソースを利用し、ローカルで動作させてみました。下記レポジトリです。

amaranthinekt/test_for_teratail

やっていて動かない原因などについて、思いつく点を下記に列挙いたします。学習や理解、原因判明の一助となれば幸いです。

  • 提示されているcors.rb は、 config/initializer/cors.rbで間違いないでしょうか? こちらはinitializerのため、設置後railsサーバーを再起動させないと適用されません。(docker-composer restartなどでコンテナごと再起動すれば良いと思います。)
    • 上記は、JSからのアクセスのクロスオリジン設定のため、有効になっていないとブラウザ上のJavaScriptから、Rails上のAPIアクセスが拒絶されます。ブラウザ上でF12を押下し、ネットワークタブを開いて、再読込すると、ブラウザから何をネットワーク上に読みに行ったか分かりますが、その中でbookshttp://localhost:3000/api/booksへのアクセス)が、赤くなっていないか、押下して見ていたら、cross-originで拒絶されてないか確認できます。
  • データが入っているかどうかは、ブラウザからhttp://localhost:3000/api/booksを開くのが一番早い解決方法かと思います。seedsで追加したようですが、seedsを実行するコマンドが提示されていなかったため、どのように追加したのか、正常に追加されているのかは不明ですが、上記ブラウザURLで確認出来るかと思います。もし、入っていない場合、seedsを実行してDBにデータを追加する方法が分からない場合は、Rails consoleから追加するのがわかりやすいかもしれません。docker-compose bash backend rails cで、Rails consoleを開き、config/seeds.rbに記載のコードを貼り付けてEnterで実行できます。
  • 提示されているfrontend/viteファイルは何かよく分かりませんでした(私が普段vite使わないせいかもしれませんが)。axiosのbaseURL設定が有効になっていないと、Railsにアクセスできませんので、ここがうまく動いてないことも原因かもしれません。私のレポジトリでは、面倒だったので、普通にfetchメソッドにhttp://からのフルパスを指定しています。
  • App.vueconst fetchBooksについては、返り値を受け取る部分、books.value = res.data.booksは誤りで、books.value = res.dataかなと思います。

投稿2023/09/07 14:00

編集2023/09/07 14:02
amaranthine

総合スコア501

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

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

gabakugik

2023/09/08 15:22 編集

App.vueの部分を見て修正しました。 表示されました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問