Open4

Ruby on Rails & Vite環境構築

rails環境構築

プロジェクトフォルダ作成

$ mkdir rails_vite_bulletin_board
$ cd rails_vite_bulletin_board

backend/Gemfileを作成

backend/Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 6.1.3'

backend/Dockerfileを作成

backend/Dockerfile
FROM ruby:3.0

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev

WORKDIR /app

COPY Gemfile /app/Gemfile

RUN bundle install
COPY . /app

docker-compose.ymlを作成

docker-compose.yml
version: '3.9'
services:
  backend:
    build: ./backend
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - ./backend:/app
    ports:
      - '8000:3000'
  mysql:
    image: mysql:5.7
    ports:
      - '3306:3306'
    volumes:
      - ./db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password

RailsをAPIモードでインストール

$ docker-compose run backend rails new . --api --force --database=mysql --skip-bundle

backend/config/database.ymlを編集

backend/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: mysql

docker image作成

$ docker-compose build

コンテナ起動

$ docker-compose up -d

DB作成

$ docker-compose exec backend bin/rails db:create

http://0.0.0.0:8000で初期画面が出れば成功

コンテナ終了

$ docker-compose down

vite環境構築

frontend/Dockerfileを作成

Dockerfile
FROM node:14.15.5-alpine

RUN apk update && npm install -g npm

WORKDIR /var/www

docker-compose.ymlにfrontendの内容を追記

docker-compose.yml
version: '3.9'
services:
  backend:
    ...
  frontend:
    build: ./frontend
    volumes:
      - ./frontend:/var/www
    ports:
      - 3000:3000
    command: 'npm run dev'
  mysql:
    ...

フロントエンドコンテナに入る

$ docker-compose run frontend ash

viteインストール

/var/www $ npm init @vitejs/app vite -- --template vue-ts

インストール確認が出るのでyで進む

Need to install the following packages:
  @vitejs/create-app
Ok to proceed? (y) 

インストールされたファイルをルートへ移動・viteフォルダ削除

/var/www $ mv vite/.gitignore vite/* /var/www/
/var/www $ rmdir vite

npm install

/var/www $ npm install

フロントエンドコンテナから抜ける

/var/www $ exit

コンテナ起動

$ docker-compose up -d

http://localhost:3000で初期画面が出れば成功

コンテナ終了

$ docker-compose down

Ruby on Rails とViteのSPA連携

フロントエンド

axios インストール

$ docker-compose run frontend npm install axios

baseApiUrl定義

frontend/src/util/util.ts
export const baseApiUrl: string = 'http://localhost:8000/api/v1/'

後に作成するヘルスチェックAPIをmount時に叩く

frontend/src/App.vue
<template>
  <img alt="Vue logo" src="./assets/logo.png" />
  <HelloWorld msg="Hello Vue 3 + TypeScript + Vite" />
</template>

<script lang="ts">
import axios from 'axios'
import { baseApiUrl } from './util/util'
import { defineComponent, onMounted } from 'vue'
import HelloWorld from './components/HelloWorld.vue'

export default defineComponent({
  name: 'App',
  components: {
    HelloWorld,
  },
  setup() {
    onMounted(async () => {
      await axios.get(`${baseApiUrl}/health_check`)
    })
  },
})
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

フロントエンド

ヘルスチェックAPI ルート作成

backend/config/routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  namespace :api do
    namespace :v1 do
      get :health_check, to: 'health_check#index'
    end
  end
end

ヘルスチェックAPI コントローラー作成

backend/app/controllers/api/v1/health_check_controller.rb
module Api
  module V1
    class HealthCheckController < ApplicationController
      def index
        head 200
      end
    end
  end
end

CORS設定 Gemfile

backend/Gemfile
+ gem 'rack-cors'

CORS設定 cors.rb

backend/config/initializers/cors.rb
# Be sure to restart your server when you modify this file.

# Avoid CORS issues when API is called from the frontend app.
# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests.

# Read more: https://github.com/cyu/rack-cors

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

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

動作確認

docker image作成

$ docker-compose build

コンテナ起動

$ docker-compose up -d

http://localhost:8000/api/v1/health_checkにアクセスしてレスポンスステータス200応答で成功

postテーブル作成

$ docker-compose exec backend rails g model post title:string
$ docker-compose exec backend rails g controller posts
$ docker-compose exec backend rake db:migrate
ログインするとコメントできます