Railsの処理が失敗した時に失敗JSONを返すことでVue.jsの処理を分岐させる

非遷移でVue.jsとRailsがやり取りするにあたって、失敗時の処理を分岐させる方法です。

以下のような形で実装しました。

Rails内の処理が成功したか失敗したかを、それぞれ別のJSONを返すことで判定
②Vue.jsでは、返ってきたJSONによって成否を判断して処理を分岐させる



Rails側の処理

def new
  #Vueからレース名を受け取って
  race_name = params[:race_name]

  #(race_nameを元にデータの取得処理を実行)

  #成否によって別のJSONを返す
  成功した場合
    render 'new', formats: 'json', handlers: 'jbuilder' 
  失敗した場合 
    render 'fail', formats: 'json', handlers: 'jbuilder' 

end



html

<div id="modal">
  <div class="modal-header">
      <input v-model="raceName" placeholder="レース名を入力">
      <button @click="scrapingData(scrJudge)">取得</button>  
  </div>
  
  <div class="modal-body">
      {{ failMsg }}
      {{ raceConfirmation }}
      {{ recordsConfirmation }} 
  </div>
       
</div>

「取得」ボタンクリックでscrapingData(scrJudge)メソッドが実行されます。コールバックになっています。


Vue.js

new Vue({
  el:  '#modal',
  data:  {
    raceName: " ",  //inputと連動
    failMsg: " ",  //失敗時のメッセージ
    raceConfirmation: " ",
    recordsConfirmation: " "
  },

  methods: {
      scrapingData(callback){        
          this.failMsg = "";  //取得ボタンを押した時点で初期化する

          let race_name = this.raceName;
          axios.get(`/api/keiba_db/get_race_records/new/${race_name}`) //Railsに処理(データの取得)を依頼
            .then(res => {     //返ってきたデータを
                callback(res);  //コールバック(scrJudge)の引数に指定
             });
        },
    scrJudge(res){   
        if(res.data.result ==="fail"){ //失敗時のJSONが返ってきた場合
            this.failMessage = "レースが見つかりませんでした ";
        }else{ //成功時のJSONが帰ってきた場合
            this.failMessage = ""; //初期化する
            this.raceConfirmation = res.data.race; //成功時のJSONから値を受け取る
            this.recordsConfirmation = res.data.records; //同上      
        }}     
    }
)}

成功した場合、modal-bodyに{{ raceConfirmation }}と{{ recordsConfirmation }}が表示されます。 失敗した場合 、{{ failMsg }}が表示されます

  <div class="modal-body">
      {{ failMsg }}
      {{ raceConfirmation }}
      {{ recordsConfirmation }} 
  </div>