Skip to content

Ruby on Rails

Общее описание

Ruby on Rails (RoR) — это MVC-фреймворк для создания веб-приложений на языке Ruby. Разработан Дэвидом Хайнемайером Ханссоном в 2004 году как часть проекта Basecamp. Фреймворк следует двум основным принципам: - Convention over Configuration (COC) — меньше конфигурации за счет принятых соглашений - Don’t Repeat Yourself (DRY) — повторное использование кода, минимизация дублирования

Основные особенности:

  • Полноценный MVC-фреймворк
  • ORM ActiveRecord
  • Миграции баз данных
  • Встроенный сервер Puma
  • Asset Pipeline (Sprockets/Webpacker)
  • Генераторы кода (scaffold, model, controller и т.д.)
  • Поддержка RESTful архитектуры
  • Кроссплатформенность (Windows, Linux, macOS)

Версии Ruby и Rails

Ruby:

  • 2.7.x
  • 3.0.x
  • 3.1.x
  • 3.2.x — последняя стабильная версия

Ruby on Rails:

Версия Год выпуска Статус
5.2 2018 Устаревшая
6.0 2020 Поддерживается до 2022
6.1 2021 Поддерживается до 2023
7.0 2021 Последняя LTS
7.1 2023 Последняя стабильная

Рекомендуется использовать Ruby 3.2+ и Rails 7.1 для новых проектов.


Установка Ruby on Rails

На Ubuntu/Debian:

sudo apt update
sudo apt install git curl
\curl -sSL https://get.rvm.io | bash -s stable --ruby
source ~/.rvm/scripts/rvm

rvm install 3.2
rvm use 3.2 --default

gem install rails

Проверка:

ruby -v
rails -v

На macOS через Homebrew:

brew install rbenv ruby-build
rbenv init
rbenv install 3.2.0
rbenv global 3.2.0

gem install rails

На Windows:

Используйте RubyInstaller или WSL (Windows Subsystem for Linux).


Архитектура Ruby on Rails

RoR следует паттерну MVC (Model–View–Controller):

Компонент Назначение
Model Представляет данные и логику работы с БД (ActiveRecord)
View Отвечает за отображение (HTML, JSON, XML)
Controller Принимает запросы, обрабатывает логику и передает данные во View

Основные компоненты:

  • ActiveRecord — ORM для работы с БД
  • ActionController — обработка HTTP-запросов
  • ActionView — рендеринг шаблонов
  • ActionMailer — отправка email
  • ActionCable — WebSocket-соединения
  • ActiveJob — фоновые задачи
  • ActiveStorage — работа с файлами и изображениями
  • Railties — основа фреймворка

Создание нового проекта

rails new myapp
cd myapp
rails server

Откройте в браузере:

http://localhost:3000

Структура проекта:

/app            # Прикладной код (models, views, controllers)
/bin            # Исполняемые файлы (bundle, rails)
/config         # Конфигурационные файлы (database.yml, routes.rb)
/db             # Миграции и сиды
/lib            # Вспомогательные библиотеки
/log            # Логи
/public         # Статические файлы
/test           # Тесты
/vendor         # Внешние зависимости
/Gemfile        # Зависимости проекта

Модели и миграции

Создание модели:

rails generate model User name:string email:string

Создаст: - app/models/user.rb - Миграцию в db/migrate/..._create_users.rb

Пример миграции:

class CreateUsers < ActiveRecord::Migration[7.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email
      t.timestamps
    end
  end
end

Запуск миграций:

rails db:migrate

Контроллеры и маршруты

Создание контроллера:

rails generate controller Welcome index

Создаст: - app/controllers/welcome_controller.rb - Шаблон app/views/welcome/index.html.erb

Настройка маршрутов в config/routes.rb:

root 'welcome#index'
get '/about', to: 'pages#about'
resources :users

Работа с базой данных

ActiveRecord — примеры использования:

user = User.new(name: "Alice", email: "alice@example.com")
user.save

User.create(name: "Bob", email: "bob@example.com")

@users = User.all
@user = User.find(1)
@user.update(name: "Robert")
@user.destroy

Scope и запросы:

User.where("age > ?", 25)
User.order(created_at: :desc)
User.limit(5)

Шаблоны и представления (Views)

Файлы .erb используются для генерации HTML:

<h1>Hello <%= @user.name %></h1>
<% if @user.admin? %>
  <p>You are an admin.</p>
<% end %>

Работа с формами

<%= form_with model: @user do |form| %>
  <%= form.label :name %>
  <%= form.text_field :name %>

  <%= form.label :email %>
  <%= form.email_field :email %>

  <%= form.submit %>
<% end %>

Аутентификация и авторизация

Devise — популярный гем для аутентификации:

gem 'devise'
bundle install
rails generate devise:install
rails generate devise User
rails db:migrate

Pundit или CanCanCan — для авторизации:

class PostPolicy
  def initialize(user, post)
    @user = user
    @post = post
  end

  def edit?
    @user.admin? || @user == @post.author
  end
end

API в Rails

Создание API-only приложения:

rails new myapi --api

Пример контроллера API:

class Api::V1::PostsController < ApplicationController
  def index
    posts = Post.all
    render json: posts
  end
end

Можно использовать: - JBuilder — шаблонизатор JSON - ActiveModel Serializers - GraphQL


Тестирование

Minitest (по умолчанию):

require "test_helper"

class UserTest < ActiveSupport::TestCase
  test "should not save user without name" do
    user = User.new(email: "test@example.com")
    assert_not user.save
  end
end

RSpec (популярная альтернатива):

describe User do
  it "is invalid without a name" do
    user = User.new(email: "test@example.com")
    expect(user).not_to be_valid
  end
end

Запуск тестов:

rails test

или

rspec

Производительность и оптимизация

Рекомендации:

  • Использовать includes() для предотвращения N+1 запросов
  • Использовать кэширование (fragment cache, Russian Doll Cache)
  • Использовать Redis/Memcached
  • Минимизировать вычисления в контроллерах и вьюшках
  • Использовать background jobs (Sidekiq, Delayed Job)

Безопасность

Основные рекомендации:

  • Использовать Strong Parameters
  • Использовать Devise/Pundit для аутентификации и авторизации
  • Использовать SSL
  • Экранировать вывод (XSS защита)
  • Использовать CSRF protection
  • Хранить секреты в credentials.yml.enc или vault

CI/CD и автоматизация

Rails активно используется в системах CI/CD: - GitHub Actions - GitLab CI - CircleCI - Jenkins - Docker - Kubernetes

Также можно использовать: - Capistrano — деплой - Whenever — CRON-задачи - God / Monit — мониторинг


Инструменты и гемы

Популярные гемы:

Гем Назначение
Devise Аутентификация
Pundit / CanCanCan Авторизация
RSpec Тестирование
FactoryBot Фабрики тестовых данных
Faker Генерация случайных данных
Sidekiq Background jobs
CarrierWave / ActiveStorage Загрузка файлов
Cocoon Динамические формы
SimpleForm Удобные формы
Bootstrap / TailwindCSS UI-стили
Webpacker / Importmap Управление JS/CSS

Деплой

Возможные платформы:

  • Heroku — простой способ запуска
  • Render — бесплатный хостинг
  • AWS Elastic Beanstalk
  • DigitalOcean App Platform
  • Capistrano + VPS
  • Docker + Kubernetes

Логирование и диагностика

Логи находятся в:

log/development.log
log/production.log

Можно использовать: - Better Errors, Pry - Skylight, New Relic, Rollbar - Lograge — упрощение логов


Сообщество и поддержка

Официальные источники: