apiをvueで表示させる

昨日書きかけだったapivueを使って表示させる部分の流れについて書いておこうと思います!

(クリックしたコメントをapiをたたいて取得してvueで表示させるだけのものです)

 

 

foremanを導入

webpackerrailsの起動を簡単にできるようにしてくれるforemanというツールを導入してみます。

 

gem foreman’とGemfileに追記し、bundle installを行います。

 

/Procfileを作成し、以下のように書きます。

web: bundle exec rails server -p $PORT

webpack: ./bin/webpack-dev-server

 

 bundle exec foreman startとコマンドを実行すると、webpackerrailsがいっぺんに立ち上がってくれます。

localhost:5000で立ち上げたサーバーへアクセスできます。

 

 

 

各ファイル編集

app/controllers/comments_controller.rb

class CommentsController < ApplicationController
def index
@comments = Comment.all
end
end

 

app/controllers/api/v1/comments_controller.rb

class Api::V1::CommentsController < ApplicationController
before_action :set_comment, only: [:show]

def show
render 'show', formats: 'json', handlers: 'jbuilder'
end

private
def set_comment
@comment = Comment.find(params[:id])
end
end

 

app/views/api/v1/comments/show.json.jbuilder

json.body @comment.body

 

app/javascripts/packs/comments/index.js

import Vue from 'vue/dist/vue.esm';
import axios from 'axios';

new Vue ({
el: '.js-commentsIndex',
data: {
commentInfo: {},
commentInfoBool: false
},
methods: {
commentShow(id){
axios.get(`api/v1/comments/${id}.json`)
.then(res => {
this.commentInfo = res.data;
this.commentInfoBool = true;
});
}
}
});

 

app/views/comments/index.html.haml

.container.js-commentsIndex
.row
.card.pink.lighten-5
選択したコメント:
%span.card-title{'v-if': 'commentInfoBool'}
{{ commentInfo.body }}

.row
- @comments.each do |comment|
.card
%span.card-title{'v-on:click': "commentShow(#{comment.id})"}
= comment.body



= javascript_pack_tag 'comments/index'

 

 

 完成イメージ

コンソールから数件ほどデータを作成し、localhost:5000/commentsへアクセスしてみます。

Image from Gyazo

 

 

感想その他

あまり凝ったことはできてませんが、vueがさわれて良かったです。

また、作成中にちょくちょく以下のエラーが出ておりました。

  Your Yarn packages are out of date!

  Please run `yarn install --check-files` to update. 

エラー文通りyarn installし直してあげれば無事解決するのですが、普通こんなにしょっちゅうyarn installし直すものなのかなというのが気になりました。。。!!!

 

 

 

参考リンク

https://qiita.com/cohki0305/items/a678b0b17c5b496c1de9