Доброго… Решил поделиться с сообществом опытом интеграции Vue.js v2 и Ruby on Rails на примере разработки чата. Для этого нам потребуется реализация websocket в Rails — ActionCable.
Это первая часть из нескольких статей чтобы не нагромождать всё в кучу и применять поэтапный подход к разработке. Эта часть в основном повторяет уже существующую статью, ссылка на которую приведена ниже, однако она необходима чтобы проследить весь процесс разработки поэтапно. Зинтересовавшимся — под кат.
Подготавливаем BackEnd
Устанавливаем гем:
gem install webpacker
Создаем новое приложение:
rails new chat --webpack=vue
Добавим gem Foreman для запуска фронта и бэка одной командой:
gem 'foreman'
и установим его:
bundle update
Создадим Procfile в корне проекта со следующим содержимым:
#Procfile
backend: bin/rails s -p 3000
frontend: bin/webpack-dev-server
создаем ресурс:
rails g resource Message body:text username:string
Добавляем методы в контроллер:
# app/controllers/messages_controller.rb
class MessagesController < ApplicationController
def index
end
def create
end
end
Определяем root_path:
#config/routes.rb:
Rails.application.routes.draw do
resources :messages
root to: 'messages#index'
end
создаем пустой файл index.html в папке app/views/messages
Подготовительные работы для Бэкенд закончены, теперь необходимо подготовить фронтенд.
Подготавливаем ФронтЕнд
После установки гема webpacker в проекте появилась новая директория app/javascript в которой будет жить наш фронтенд. Немного изменим существующую архитектуру фронтенда. для этого создадим директорию app/javascript/packs/component и поместим в неё файл app.vue
такого содержания:
<template>
<div id="app">
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
data: function () {
return {
message: "Hello Vue!"
}
}
}
</script>
<style scoped>
p {
font-size: 2em;
text-align: center;
}
</style>
содержимое файла app/javascript/packs/application.js заменим на:
import Vue from 'vue'
import App from './components/app.vue'
document.addEventListener('DOMContentLoaded', () => {
const el = document.body.appendChild(document.createElement('application'))
const app = new Vue({
el,
render: h => h(App)
})
console.log(app)
})
В application.html.erb заменяем подключения js и css
<head>
<title>Chat</title>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag 'application', media: 'all' %>
<%= stylesheet_pack_tag 'application', media: 'all' %>
<%= javascript_pack_tag 'application' %>
<!-- <%= csrf_meta_tags %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> -->
</head>
Первый запуск
bundle binstubs bundler --force
foreman start
В браузере по адресу http://localhost:3000 мы должны увидеть страницу с надписью Hello Vue!
На этом подготовка проекта закончена и можно перейти к разработке чата.
Код на GitHub.
Voiddancer
Будет дополняться эта статья или новую напишете?