データ削除後の表示を非遷移で更新する

シングルページアプリケーションなのでデータの削除時も非遷移で表示が変更されなければいけません。
しかし、Vueのメソッド内で


・axiosでdeleteリクエストを送信
・データ取得メソッドを実行


とそのまま記述しても

①axiosでdeleteリクエストを送信
②データ取得メソッドを実行
ActiveRecordによって削除クエリが実行

という順番で進行してしまい、削除完了後のデータを再取得することができませんでした。



これをRailsで削除処理終了後にJSONを返して、VueでそのJSONを受け取った後にデータ取得メソッドを実行させることで解決しました。



html

<button class="header-btn" v-on:click="raceDestroy()">選択したレースを削除</button>



Rails側(変更前)

  def destroy
    race = Race.find(params[:race_id]) #VueからレースのIDを受け取って
    race.destroy   #削除する
    render body: nil
  end



Rails側(変更後)

  def destroy
    race = Race.find(params[:race_id]) #VueからレースのIDを受け取って
    race.destroy   #削除する
    
    @msg = "destroyed"  #何でもいいからJSONを返す
    render 'destroy', formats: 'json', handlers: 'jbuilder'
  end



JSONの中身は何でもいい

json.msg @msg



Vue.js(変更前)

    raceDestroy(){
      let race_id = this.activeRaceId; //選択中のレースのIDを代入
      axios.delete(`/api/keiba_db/destroy/${race_id}`) //Railsに処理を依頼
    
      this.getRacesIndex(); //レース一覧を取得
      this.getRecordsIndex(); //レコード一覧を取得
      },



Vue.js(変更後)

    raceDestroy(){
      let race_id = this.activeRaceId;
      axios.delete(`/api/keiba_db/destroy/${race_id}`)
        .then(res => {
          this.getRacesIndex();
          this.getRecordsIndex();
        });
      },




「解決しました(キリッ」とか書いてるけど、これはもっと上手いやり方があると思う。
じゃないとSPAにおいて無駄JSONが大量生産されることになるからなあ