16
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

axiosをrailsと通信するときにとりあえずやっておくこと

Last updated at Posted at 2018-02-13

環境

  • rails (5.2.0.rc1)
  • @rails/webpacker (3.2.1)
  • axios (0.17.1)

rails, axiosは導入済みとします

2018/3/2
systemテスト時にcsrf-tokenが取れなくてエラーになったのでaxiosのREADMEを眺めていたら
インスタンス作成時にオプションで指定すればいいだけだったのでそのように修正
csrf-tokenもない場合の考慮を入れました

2018/5/14
検索などgetでネストしたパラメータをaxiosで送ろうとしたら

axios.get('items', {
  params: {
    search: {word: "hoge"},
    page: 1
  }
})
Started GET "/items?search=%7B%22word%22:%22hoge%22%7D&page=1"
Parameters: {"search"=>"{\"word\":\"hoge\"}", "page"=>"1"}

上記のようにエスケープされてしまい params[:search][:word] が出来ませんでした
ということで、axiosはパラメータのパーサーを上書き出来るようなので下記を追加したところ

yarn add qs
import qs from 'qs'

const instance = axios.create({
  ...

  paramsSerializer: (params) => {
    return qs.stringify(params, {arrayFormat: 'brackets'})
  }
Started GET "/items?search%5Bword%5D=hoge&page=1"
Parameters: {"search"=>{"word"=>"hoge"}, "page"=>"1"}

良い感じになりました

成果物

app/javascript/packs/axios.js
import axios from 'axios'
import qs from 'qs'

const tokenElement = document.querySelector('meta[name=csrf-token]')
const instance = axios.create({
  headers: {
    'X-Requested-With': 'XMLHttpRequest',
    'X-CSRF-TOKEN': (tokenElement) ? tokenElement.content : null
  },

  paramsSerializer: (params) => {
    return qs.stringify(params, {arrayFormat: 'brackets'})
  }
})

export default instance

一旦AxiosRootでオリジナルをインポートしてから、extendsした新しいAxiosクラスにhadersを定義するという感じです
後は拡張したファイルを使う場所でimportして使うだけです

app/javascript/packs/items.js
import Vue from 'vue/dist/vue.esm'
import axios from './axios'

export default {
  name: 'ItemList',

  props: {
    url: {
      type: String,
      required: true
    }
  },

  data () {
    return {
      items: []
    }
  },

  created () {
    this.asyncItems()
  },

  methods: {
    asyncItems () {
      axios.get(this.url).then(response => {
        this.items = response.data
      }).catch(error => {
        console.log(error)
      })
    }
  }
}

参照

https://github.com/axios/axios/issues/391
https://qiita.com/sukechansan/items/738b4bdaffc07c337a70

16
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?