- Упрощение
- Гемы
- Команды для Makefile
По генератору
По работе с бд
По архитектуре
Решение возможных проблем
Перейдите в нужный каталог для создания проверьте что установленна корректная версия
ruby -v
по необходимости установите нужную версию
rbenv versions
rbenv local 3.1.3
ruby -v
у Ruby On Rails есть дополнительные настройки при создании проекта
rails -h
пример набора для создание бэкенда
rails new backend_xx --api -d postgresql -MCSJT --skip-webpack-install --skip-action-mailbox --skip-action-text --skip-active-job --skip-active-storage --skip-spring --skip-listen --skip-system-test --skip-bootsnap
Выполните генерацию
bundle e rails g model User
она создат модель и таблицу
invoke active_record
create db/migrate/20240505204541_create_users.rb
create app/models/user.rb
доработайте миграцию, например
class CreateUsers < ActiveRecord::Migration[7.1]
def change
enable_extension "postgis"
create_table :users do |t|
t.integer :vk_id
t.string :state
t.boolean :join_group, default: false
t.boolean :save_favoutire, default: false
t.boolean :save_display, default: false
t.integer :liked, default: 0
t.datetime :start_date
t.timestamps
end
end
end
выполните аннотации если исползуете гем
Добавьте гем в Gemfile
gem 'activerecord-postgis-adapter'
поменяйте адаптер в database.yml
adapter: postgis
укажите в миграции
t.st_point :point, geographic: true
bundle e rails generate controller user
db_create:
bundle exec rake db:create --trace
db_migrate:
bundle exec rake db:migrate
bundle exec rake db:migrate RAILS_ENV=test
make annotate
annotate:
bundle exec annotate --models
Вариант 1
Сначала вызвать аннотации, а затем проверить
check_annotate:
git diff --exit-code app/models
Вариант 2
Сразу проверить без вызова
check_annotate:
bundle exec annotate --models --frozen
Добавьте гем https://github.com/ctran/annotate_models в Gemfile
gem 'annotate'
выполните команду
bundle
Добавьте файл auto_annotate_models.rake
в папку lib/tasks/
следующего содержимого
if Rails.env.development? || Rails.env.test?
require 'annotate'
task set_annotation_options: :environment do
Annotate.set_defaults(
position: 'after',
show_indexes: true,
simple_indexes: true,
show_foreign_keys: true,
show_complete_foreign_keys: false,
with_comment: true
)
end
Annotate.load_tasks
end
выполните аннотации
Добавьте make команду для проверки аннотаций
Вариант 1 хорош тем что можно добавить вызов аннотаций при вызове миграций, и тогда не будете забывать вызывать аннотации
и еще команду
check: check_annotate
настройте database.yml
default: &default
adapter: postgis
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV.fetch('POSTGRES_USER', '') %>
password: <%= ENV.fetch('POSTGRES_PASSWORD', '') %>
host: <%= ENV.fetch('POSTGRES_HOST', 'localhost') %>
port: <%= ENV.fetch('POSTGRES_PORT', '5432'.to_i) %>
database: <%= ENV.fetch('POSTGRES_DB_NAME', 'test') %>
добавьте такой .gitlab-ci.yml
default:
image: ruby:3.1.3
stages:
- test
variables:
KUBERNETES_CPU_LIMIT: 4
KUBERNETES_MEMORY_LIMIT: 8Gi
KUBERNETES_SERVICE_CPU_LIMIT: 4
KUBERNETES_SERVICE_MEMORY_LIMIT: 4Gi
test:
variables:
POSTGRES_DB: backend_xx_test
POSTGRES_HOST: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_PORT: '5432'
RAILS_ENV: test
GITLAB_CI: 'true'
TZ: 'Europe/Moscow'
PGTZ: 'Europe/Moscow'
stage: test
services:
- name: postgis/postgis:13-3.1-alpine
alias: postgres
cache:
key: gems
paths:
- vendor/ruby
policy: pull
before_script:
- export PATH=$PATH:/usr/local/rbenv/shims
- gem install bundler
- bundle install -j $(nproc)
- make db_reset
script:
- make check
artifacts:
expire_in: 1 week
when: always
reports:
# cobertura: coverage/coverage.xml
junit:
- ./junit/*.xml
закомитьте и запушьте правки, билд должен пройти
Добавьте в Gemfile
https://github.com/rspec/rspec-rails
gem 'rspec-rails'
и настройте
rails generate rspec:install
gem 'byebug'
Установка
gem 'rubocop-rails'
автофрматирование
bundle e rubocop -A
сгенерировать файл со скипами того что не отавтоформатировать
bundle e rubocop --auto-gen-config
Что бы убрать
frozen_string_literal: true
# Разрешить не замораживать строки.
Style/FrozenStringLiteralComment:
EnforcedStyle: never
bundle e rubocop -A
gem 'factory_bot_rails'
Добавить в config/application.rb
строку
config.active_record.dump_schema_after_migration = false
Размещайте их в директории app/lib
Ошибка может быть связана с Zeitwerk
выполнит команду, для получения подробности по ошибке
bin/rails zeitwerk:check
в моем случае ошибка была связана с тем что я использовал акроним который не был определен
point.distance(event.point).round / 1000
Достаточно spec_helper.rb
удалите из всех файлов
require 'rails_helper'
в фале .rspec
и так уже есть
--require spec_helper
сначала из rails_helper
удалите все комментарии
затем перенесите все содержимое в начало файла spec_helper.rb
только уберите инклюд spec_helper.rb
затем можете соединить конфиг RSpec.configure do |config|
в его начало
Для того что бы придерживаться модульной архитектуры, более гибкой связанности и удобной навигации
- если модель уже есть, то начать надо с того что бы переименовать таблицу в формат
global_local
где global
это имя основной модели в которую будет вложенность, а local
название модели которое будет внутри
-
если переименоваются миграции, то лучше имя их файлов тоже переименовать
-
если есть фабрика то ее тоже обновить, имя ее файла, и ее вызовы
на этом этапе можно выполнить миграции и проверить тесты
-
теперь можно создать папку с именем основной модели, и перенести туда модель вложенную
-
переименовать файл в
local
где название модели которое внутри и вызов файла поменять, и в файле указать что это вложенный class -
фабрику тоже вложить в новую папку
-
и поправить в фабрике вызов
factory :global_local, class: 'Global::Local' do
-
поменять в коде вызовы на
Global::Local
на этом этапе можно снова проверить корректность прохождения тестов
- если ведете erd диаграммы, то не забудьте их тоже обновить