###途中で投げ出すのはやめましょう
回答者も分からないものは分からないと言う素直さも必要です
###解決したいこと
Vue.jsでrouter-linkでerbファイルで実装されているページに遷移しようと思っています
URLは変わるのですが、画面がリロードしないと変わりません
こちらを参照して、TweetIndexPAge.vueに実装してみましたが変わりませんでした
対処法をよろしくお願いします
###ルーティング
Tweetsコントローラーを、apiと通常のコントローラーで分けています
resources :tweets do collection do get :search end resources :comments,only:[:create,:destroy] resources :likes,only:[:create,:destroy] end namespace :api,{format: 'json'} do namespace :v1 do resources :tweets,only:[:index] end end
###コントローラー
apiを使用してindexアクションでTweetモデルのレコードを取得しています
class Api::V1::TweetsController < ApiController rescue_from ActiveRecord::RecordNotFound do |exception| render json: { error: '404 not found' }, status: 404 end def index @tweets = Tweet.includes(:user).page(params[:page]).per(5).order("created_at DESC") render 'index', formats: 'json', handlers: 'jbuilder' end end
###Jbuilder
Jbuilderでデータの整形を行います
json.array! @tweets do |tweet| json.nickname tweet.user.nickname json.text tweet.text json.school_a tweet.school_a.name json.school_b tweet.school_b.name json.title tweet.title_info json.id tweet.id json.time tweet.created_at.strftime("%Y年%m月%d日 %H時%M分") end
###index.html.erb
views > tweets > index.html.erb
indexページでjsファイルを読み込み
<%= javascript_pack_tag 'tweet_vue' %>
###tweet_vue.js
app.vueをインポートします
import Vue from 'vue' import App from '../app.vue' document.addEventListener('DOMContentLoaded', () => { const el = document.body.appendChild(document.createElement('tweet')) const app = new Vue({ el, render: h => h(App) }) })
TweetIndexPage.vueはindex.html.erbで表示させています
遷移したいページはツイートの詳細ページです
tweets > show.html.erb(/tweets/id)
######----------------------------ここまで追記------------------------------------------
###app.vue
ルートを設定します
<template> <div> <router-view></router-view> </div> </template> <script> import Vue from 'vue' import VueRouter from 'vue-router' import TweetIndexPage from 'TweetIndexPage.vue' const router = new VueRouter({ mode: 'history', routes: [ {path: '/tweets', component: TweetIndexPage} ] }) Vue.use(VueRouter) export default { router } </script> <style scoped> </style>
###TweetIndexPage.vue
<template> <div id="app"> <div v-for="e in tweets" :key="e.id"> <div class="article mt-5"> <router-link :to="`tweets/${e.id}`"> //遷移先へ <div class="article-title"> {{e.school_a}}vs{{e.school_b}} </div> <div class="article-image"> <i class="fa fa-baseball-ball text-white"></i> </div> <div class="sub-title"> {{e.title}} </div> <div class="name"> 投稿者 {{e.nickname}} </div> <div class="tweets_at"> {{e.time}} </div> </router-link> </div> </div> </div> </template> <script> import axios from 'axios'; export default { data: function() { return { tweets: [] } }, mounted() { axios .get('/api/v1/tweets.json') .then(response => (this.tweets = response.data)) }, beforeRouteUpdate (to, from, next) { const url = this.makeUrl(this.baseUrl, to.query); this.fetchUserList(url); next(); }, } </script> </style>
回答1件
あなたの回答
tips
プレビュー