imagen

WIP: Ruby on rails

👨‍💻 Hola Mundo

⚠️ Descargo de responsabilidad ⚠️

Los siguientes "apuntes" no pretenden ser un tutorial detallado, sino apuntes resumidos del tutorial paso a paso de ruby on rails en su documentación oficial. Se recomienda revisarla antes o en paralelo.

Generadores

Rails provee generadores que son scripts que nos ayudan a agilizar ciertas tareas repetitivas como por ejemplo, creación de un nuevo proyecto con rails new blog creara un nuevo proyecto con todo el directorio base para empezar a trabajar, o podemos crear un nuevo modelo con rails generate controller Articles index y nos creara todos los directorios y archivos basicos para empezar a trabajar.

Rutas

Son reglas de "enrutamiento", actúan como "gateway" entre las peticiones HTTP (el universo exterior) y los controladores de nuestra aplicación.

# config/routes.rb

# Para definir nuestro Home (path raiz)
root "articles#index"

# method 'get' to: 'controller#method'
get "/articles", to: "articles#index"


# For details on the DSL available within this file, 
# see https://guides.rubyonrails.org/routing.html

Controlador

Son clases de Ruby y sus métodos públicos con las diferentes acciones que pueden ser recibidas desde las rutas. El controlador se encarga de conseguir/manipular/preparar la data necesario para mostrarla en una vista y devolverla al cliente.

Podemos generar el controlador usando bin/rails generate, esto nos va a generar el archivo para el controlador, las vistas, directorio para test y helpers.

create  app/controllers/articles_controller.rb
create  app/views/articles
create  app/views/articles/index.html.erb
create  test/controllers/articles_controller_test.rb
create  app/helpers/articles_helper.rb

Nuestro index esta vacío, no especifica de forma explicita que vista debe renderizar, por lo cual rails "intentara" mostrar una vista que tenga relación con el nombre del controlador y el método, en este caso intentara mostrar app/views/articles/index.html.erb de forma predeterminada.

# app/controllers/articles_controller.rb
class ArticlesController < ApplicationController
  def index
  end
end

Vista

Son plantillas generalmente escritas en una mezcla de ruby y html en archivos con extension .erb

# app/views/articles/index.html.erb
<h1>Hello, Rails!</h1>

Creado el controlador y la vista, debemos agregar en las rutas, nuestra ruta para el controlador que acabamos de crear

# config/routes.rb

# method 'get' to: 'controller#method'
get "/articles", to: "articles#index"

Son esto, si iniciamos nuestro servidor bin/rails server y visitamos la ruta http://localhost:3000/articles podremos ver nuestro Hello, Rails! \o/

Autoloading

En Rails las clases de aplicación y módulos están disponibles en todas partes, no es necesario hacer requiere. Para mas detalles revisa esta sección

🗂️ Hola base de datos

Modelo

Un Modelo es una clase en ruby que es usada para representar datos. Adicionalmente los modelos pueden interactuar con la base de datos de la aplicación mediante una característica de Rails llamada ActiveRecord Ref

Para definir un nuevo modelo, podemos usar el generador que nos provee rails y escribir bin/rails generate model Article title:string body:text.

Los nombre de los modelos son en singular, por que al instanciarlos, estos representan un solo registro.

Al generar un nuevo modelo, se genera de forma automática dos archivos

  • app/models/article.rb : donde se define nuestro modelo
  • db/migrate/<timestamp>_create_articles.rb : archivo de migración
# app/models/article.rb
class Article < ApplicationRecord

end

Migración

Son usadas para alterar la estructura de la base de datos de la aplicación. En rails son clases escritas en ruby y pueden ser agnósticas a la base de datos.

# db/migrate/<timestamp>_create_articles.rb
class CreateArticles < ActiveRecord::Migration[7.0]
  def change
    create_table :articles do |t|
      t.string :title
      t.text :body

      t.timestamps
    end
  end
end

Al llamar a create_table, se define como la tabla articles debe ser construida.

  • Se creará una columna id como primary key auto incremental.
  • En el bloque se incluyen title y body por que se incluyeron en la definición del generador del modelo generate model Article title:string body:text
  • En la última linea del bloque se llama a t.timestamps Este método define dos campos adicionales

    • created_at: Cuando fue creado el registro
    • updated_at: Cuando fue actualizado el registro

Para que nuestro modelos recién generado se vea reflejado en nuestra base de datos, debemos decirle a rails que aplique estos cambios, y lo hacemos ejecutando bin/rails db:migrate

Para ver en detalle esto, visita la docu oficial aquí

Interactuando con los modelos

Rails posee una consola interactiva similar a irb, para ingresar a ella basta con poner bin/rails console

Inicializar un objeto

article = Article.new(title: "Hello Rails", body: "I am on Rails!")

Guardando el objeto en la DB

article.save

Después de haber guardado el objeto, podemos imprimirlo en consola y notaremos que los atributos id, created_at, updated_at han sido definidas. Esto ocurre cuando nuestros objetos han sido guardados.

Para crear un item directo en la base de datos, puedes usar el método create directamente

user = User.create(name: "David", occupation: "Code Artist")

Buscando un objeto en la DB por su primary key

Article.find(1)
=> <Article id: 1, title: "Hello Rails", body: "I am on Rails!", created_at: "2020-01-18 23:47:30", updated_at: "2020-01-18 23:47:30">

Buscando todos los registros de un modelo

Article.all
=> #<ActiveRecord::Relation [#<Article id: 1, title: "Hello Rails", body: "I am on Rails!", created_at: "2020-01-18 23:47:30", updated_at: "2020-01-18 23:47:30">]>

Este método retorna un ActiveRecord::Relation que es un array con super poderes.

ActiveRecord::Relation es una representación de una consulta que se puede ejecutar en su base de datos (pero aún no se ejecutó). Una vez que ejecute esa consulta llamando a to_a, each, first, etc. en esa relación, se devolverá una sola instancia o una matriz de instancias de ActiveRecord::Base.

fuente: stackoverflow 😬

Para profundizar puedes revisar:

Mostrando una lista de artículos