Ruby: El Lenguaje de la Felicidad

Aprende Ruby y Rails para desarrollo web elegante y productivo


Ruby: El Lenguaje de la Felicidad
1 Cargando...

Ruby: El Lenguaje de la Felicidad

Ruby es un lenguaje de programación dinámico, de código abierto, enfocado en simplicidad y productividad. Creado por Yukihiro “Matz” Matsumoto en 1995 en Japón, Ruby fue diseñado para hacer felices a los programadores, con una sintaxis natural que se lee casi como inglés.

Filosofía Ruby: “Ruby está diseñado para hacer felices a los programadores.” - Matz. Esta filosofía se refleja en cada aspecto del lenguaje.

Características Distintivas

  1. Todo es un Objeto - Incluso números y booleanos son objetos
  2. Bloques y Procs - Closures poderosas y elegantes
  3. Metaprogramación - Código que escribe código
  4. Duck Typing - Si camina como pato y hace quack…
  5. DSLs - Facilidad para crear Domain Specific Languages
  6. Ruby on Rails - Framework que revolucionó el desarrollo web

Fundamentos

Tipos y Variables

# Variables locales
nombre = "María"
edad = 25
altura = 1.68
activo = true

# Símbolos (inmutables y únicos)
estado = :pendiente
rol = :admin

# Arrays
frutas = ["manzana", "banana", "naranja"]
frutas << "uva"  # Añade
frutas.push("fresa")

# Hashes
usuario = {
  nombre: "María",
  email: "[email protected]",
  edad: 25
}

# Acceso
usuario[:nombre]  # "María"
usuario.fetch(:telefono, "No proporcionado")

# Rangos
numeros = (1..10)
letras = ("a".."z")
numeros.to_a  # [1, 2, 3, ..., 10]

# String interpolation
mensaje = "¡Hola, #{nombre}! Tienes #{edad} años."

Métodos y Bloques

# Método simple
def saludar(nombre)
  "¡Hola, #{nombre}!"
end

# Método con valor por defecto
def crear_usuario(nombre, email, activo: true)
  { nombre: nombre, email: email, activo: activo }
end

# Método con bloque
def ejecutar_con_log
  puts "Iniciando..."
  resultado = yield
  puts "Finalizando..."
  resultado
end

ejecutar_con_log { 2 + 2 }  # Retorna 4

# Bloques con parámetros
[1, 2, 3].map { |n| n * 2 }  # [2, 4, 6]

# Procs y Lambdas
duplicar = ->(x) { x * 2 }
duplicar.call(5)  # 10

# Method chaining
resultado = [1, 2, 3, 4, 5]
  .select { |n| n.even? }
  .map { |n| n * 2 }
  .sum

Clases y Objetos

# Clase básica
class Usuario
  attr_reader :id, :email
  attr_accessor :nombre

  def initialize(nombre, email)
    @id = SecureRandom.uuid
    @nombre = nombre
    @email = email
    @activo = true
  end

  def saludar
    "¡Hola, #{@nombre}!"
  end

  def activo?
    @activo
  end

  def desactivar!
    @activo = false
  end
end

# Herencia
class Admin < Usuario
  attr_reader :permisos

  def initialize(nombre, email, permisos = [])
    super(nombre, email)
    @permisos = permisos
  end

  def puede?(accion)
    permisos.include?(accion.to_sym)
  end
end

# Módulos (mixins)
module Timestamps
  def touch
    @updated_at = Time.now
  end

  def created_at
    @created_at ||= Time.now
  end
end

class Articulo
  include Timestamps

  def initialize(titulo)
    @titulo = titulo
  end
end

Enumerables

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Transformaciones
doblados = numeros.map { |n| n * 2 }
pares = numeros.select { |n| n.even? }
impares = numeros.reject { |n| n.even? }

# Reducciones
suma = numeros.reduce(0) { |acc, n| acc + n }
suma = numeros.sum  # Atajo

# Búsquedas
primer_par = numeros.find { |n| n.even? }
todos_pares = numeros.all? { |n| n.even? }
algun_par = numeros.any? { |n| n.even? }

# Agrupamiento
grupos = numeros.group_by { |n| n.even? ? :par : :impar }

# Ordenación
usuarios = [
  { nombre: "María", edad: 25 },
  { nombre: "Juan", edad: 30 },
  { nombre: "Ana", edad: 22 }
]

ordenados = usuarios.sort_by { |u| u[:edad] }
mas_viejo = usuarios.max_by { |u| u[:edad] }

Ruby on Rails Esencial

# Model con validaciones
class Usuario < ApplicationRecord
  has_many :posts, dependent: :destroy
  belongs_to :empresa

  validates :nombre, presence: true, length: { minimum: 2 }
  validates :email, presence: true, uniqueness: true

  scope :activos, -> { where(activo: true) }
  scope :admins, -> { where(rol: :admin) }
end

# Controller RESTful
class UsuariosController < ApplicationController
  before_action :set_usuario, only: [:show, :update, :destroy]

  def index
    @usuarios = Usuario.activos.includes(:empresa)
    render json: @usuarios
  end

  def create
    @usuario = Usuario.new(usuario_params)
    
    if @usuario.save
      render json: @usuario, status: :created
    else
      render json: { errors: @usuario.errors }, status: :unprocessable_entity
    end
  end

  private

  def set_usuario
    @usuario = Usuario.find(params[:id])
  end

  def usuario_params
    params.require(:usuario).permit(:nombre, :email, :empresa_id)
  end
end

Herramientas Esenciales

HerramientaPropósito
BundlerGestor de dependencias
RailsFramework web full-stack
RSpecFramework de tests
RubocopLinter y formateador
PryConsola interactiva avanzada

Lista de Verificación de Aprendizaje

  • Dominar bloques, procs y lambdas
  • Entender módulos y mixins
  • Aprender métodos Enumerable
  • Estudiar metaprogramación
  • Practicar con Ruby on Rails
  • Escribir tests con RSpec
  • Crear una API REST

Recursos Esenciales

Cita

“Ruby es simple en apariencia, pero muy complejo por dentro, como el cuerpo humano.” - Yukihiro Matsumoto


¡Ruby hace que la programación sea una experiencia placentera. Descubre la felicidad de programar con Ruby!