Ruby on Rails — Cheat Sheet

Tag: ruby, rails, mvc, backend, active record, framework

Livello: intermedio

TL;DR: Framework MVC full-stack basato su Ruby. Privilegia la convenzione sulla configurazione (CoC) e il principio DRY per massimizzare la velocità di sviluppo.

Concetti chiave

Pattern MVC (Model-View-Controller) per separare i dati, l'interfaccia utente e la logica di controllo.

Convention over Configuration (CoC): regole di naming predefinite evitano di dover scrivere configurazioni esplicite.

Don't Repeat Yourself (DRY): promuove il riutilizzo del codice per evitare duplicazioni.

Active Record: sistema ORM integrato che mappa le tabelle del database su oggetti Ruby.

Routing: il file config/routes.rb associa gli URL in ingresso alle azioni dei controller.

Migrazioni: script Ruby che permettono di evolvere lo schema del database in modo incrementale.

Action View: gestisce il rendering dei template, tipicamente utilizzando la sintassi ERB.

Asset Pipeline: sistema per elaborare, concatenare e minimizzare file JavaScript e CSS.

Scaffolding: sistema per generare rapidamente lo scheletro di risorse CRUD funzionanti.

Domande tipiche e risposte pronte

Q: Qual è la differenza tra has_many :through e has_and_belongs_to_many?R: Uso has_many :through quando il modello di join necessita di validazioni, callback o attributi aggiuntivi. Uso l'altro solo per join puramente relazionali.

Q: Come risolvi il problema delle query N+1 in Active Record?R: Utilizzo i metodi includes, preload o eager_load per caricare le associazioni in memoria con un numero ridotto e fisso di query SQL.

Q: Cosa sono i callback di Active Record e quando vanno evitati?R: Sono hook che si attivano durante il ciclo di vita dell'oggetto. Li evito quando introducono logica esterna, preferendo in quei casi dei service object.

Insidie e errori comuni

Creare "fat controllers": inserire troppa logica di business nei controller invece di spostarla nei modelli o in classi dedicate.

Abusare dei callback di Active Record, rendendo i test lenti e introducendo side effect imprevedibili.

Dimenticare di definire gli indici a livello di database per le chiavi esterne durante la scrittura delle migrazioni.

Ignorare la sanitizzazione degli input nei metodi where costruiti con stringhe grezze, esponendosi a SQL injection.

Snippet e comandi

# Creare un nuovo progetto con PostgreSQL
rails new my_app -d postgresql

# Generare un modello
rails generate model User name:string age:integer

# Eseguire le migrazioni pendenti
rails db:migrate

# Esempio di query con eager loading e scope
@users = User.includes(:posts).where(active: true).order(created_at: :desc)

# Esempio di controller
class UsersController < ApplicationController
  def index
    @users = User.all
  end
end

Da ripassare

[ ] Pattern avanzati come Service Object, Form Object e Query Object.

[ ] Implementazione e configurazione di Active Job con Sidekiq.

[ ] Meccanismi di caching (Fragment caching, Russian Doll caching).

Riferimenti

Ruby on Rails Guides

Ruby on Rails API Documentation

Jarvis Interviews
Jarvis