見出し画像

[Nuxt.js × Rails API] axiosでRailsへ通信する際はCORSの設定が必要

NuxtとRails APIモードを用いたアプリ作成法を学んでいるのですが、NuxtからRailsへアクセスする際にはCORSと言われるものが重要みたいです。

CORSとは

CORSとはCross-Origin Resource Sharingの略です。

AJAX通信でことなるドメインへアクセスする際に、手軽に安全にアクセスするための仕様となります。

より詳しい説明は以下が参考になります。


Nuxt側の記述

Nuxt側はaxiosでPostリクエストを送ります。

ユーザー登録を想定しています。

Railsはlocalhost:5000で立ち上げているものとします。

const user = {
  email: this.email,
  name:  this.name,
  uid:   this.uid,
};

axios.post("http://localhost:5000/v1/users", {user}).then(() => {
  this.$router.push("/");
})


Rails側の設定

まずはコントローラ設定

# controllers/v1/users_controller.rb

class V1::UsersController < ApplicationController
 
 def create
   user = User.new(user_params)
   if user.save
     render json: user, status: :created
   else
     render json: user.errors, status: :unprocessable_entity
   end
 end

 private
 def user_params
   params.require(:user).permit(:email, :uid, :name)
 end
end

続いてgem追加です。

rack-corsというgemをインストールします。

#Gemfile

gem 'rack-cors'

Gemfileにもともとコメントアウトで記述されているので、有効にし、bundle installしてください。

$ bundle install

インストールするとconfig/initializers/cors.rbというファイルが生成されているので以下のように記述します。

# config/initializers/cors.rb

Rails.application.config.middleware.insert_before 0, Rack::Cors do
 allow do
   origins 'localhost:3000'

   resource '*',
     headers: :any,
     methods: [:get, :post, :put, :patch, :delete, :options, :head]
 end
end

originsのところにアクセスを許可したいドメインを入力する形となります。

正規表現を用いたり、複数ドメイン書いたりできるので柔軟性あります。

これでNuxtとRailsで通信ができます!

まとめ

やはりフロントとサーバーサイド分けるのは色々と知識必要ですね。

しかしながら、処理速度は重要なので引き続き学びます。

この記事が気に入ったらサポートをしてみませんか?