Skip to content

Latest commit

 

History

History
434 lines (315 loc) · 12.4 KB

rails.md

File metadata and controls

434 lines (315 loc) · 12.4 KB

💎 Ruby

Про Ruby on Rails

Checklist для идеального нового проекта

Советы

По генератору

По работе с бд

По архитектуре

Решение возможных проблем

Создать новый проект без лишних зависимостей

Перейдите в нужный каталог для создания проверьте что установленна корректная версия

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

Добавления гема annotate

Добавьте гем 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

выполните аннотации

Проверка актуальности аннотаций на GitLab CI

Добавьте 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

закомитьте и запушьте правки, билд должен пройти

Для тестирования rspec-rails

Добавьте в Gemfile https://github.com/rspec/rspec-rails

gem 'rspec-rails'

и настройте

rails generate rspec:install

Для дебага byebug

gem 'byebug'

Для проверки style guide rubocop-rails

Установка

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'

Убрать db/schema.rb

Добавить в config/application.rb строку

config.active_record.dump_schema_after_migration = false

Автозагрузка lib

Размещайте их в директории app/lib

FrozenError can't modify frozen Array

Ошибка может быть связана с Zeitwerk выполнит команду, для получения подробности по ошибке

bin/rails zeitwerk:check

в моем случае ошибка была связана с тем что я использовал акроним который не был определен

Расчет расстояния в км между точками

point.distance(event.point).round / 1000

Упразднить spec/rails_helper.rb

Достаточно 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 диаграммы, то не забудьте их тоже обновить