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 — упрощение логов
Сообщество и поддержка
Официальные источники:
- https://rubyonrails.org
- https://guides.rubyonrails.org — официальное руководство
- https://api.rubyonrails.org — API-документация