RailsのAPIで、Vue側から値の変更をPOST送信するやり方がわかりません。
GetリクエストでJson形式のデータを取ってきて配列に代入し、表示する方法はわかりました。
Vue側での値の変更をRailsのモデルに反映するPostリクエストはどのようにすればよいでしょうか?
今回は、ボタンを押すと値が1つ増える仕組みで試験しています。
11/12追記(タイトル変更)
byebugで確認したところ、paramsとparams.fetchの値は入っていましたが、permitでエラーになっています。
paramsとparams.fetchの値は以下の通りです。
paramsの結果
<ActionController::Parameters {"array"=>[{"cnt"=>"51"}], "controller"=pi/array", "action"=>"create"} permitted: false>
params.fetch(:array, {})の結果
[<ActionController::Parameters {"cnt"=>"51"} permitted: false>]
params.fetch(:array, {}).permit(:cnt)の結果
*** NoMethodError Exception: undefined method `permit' for #<Array:0x00007ff8350162d0> nil
APIcontroller
1 def index 2 @cnt = Array.all.sum(:cnt) 3 respond_to do |f| 4 f.any { render json: [ cnt: @cnt, } 5 end 6 end 7 8 def create 9 @test = Array.find(current_user.id) 10 @test.update(array_params) 11 head :created 12 end 13 14 private 15 16 def array_params 17 params.fetch(:array, {}).permit(:cnt) 18 end
Vue
1<template> 2 <span v-for="test in Array" v-bind:key="test.cnt"> 3 {{ test.cnt }} 4 <p @click="Pluse()"> 5 カウントを増やす 6 </p> 7 </span> 8</template> 9 10<script> 11import axios from 'axios' 12import { csrfToken } from 'rails-ujs' 13axios.defaults.headers.common['X-CSRF-TOKEN'] = csrfToken() 14export default { 15 data() { 16 return { 17 Array:{} 18 } 19 }, 20 21 computed: { 22 count() { 23 return this.Array[0].cnt 24 }, 25 }, 26 created: function() { 27 this.Get().then(result => { 28 this.Array = result.data 29 }) 30 }, 31 methods: { 32 modelSave: async function () { 33 const res = await axios.post('/api/array', {array: this.Array}) 34 if (res.status !== 201) { 35 process.exit() 36 } 37 }, 38 Pluse: async function () { 39 this.Array[0].cnt ++ 40 this.modelSave().then(result => { 41 this.Array = result.data 42 }) 43 }, 44 Get: async function() { 45 const res = await axios.get(` /api/array`) 46 if (res.status !== 200) { process.exit() } 47 return res 48 }, 49 } 50}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/21 17:42