RUBY
ON RAILS:
LET'S TAKE A RIDE!
💎+ 🛤 = ⚡️
Título
Subtítulo
Destacado
Texto
# lib/hola.rb
class Hola
def self.hi
puts "Hello world!"
end
end
Lista:
- Item 1
- Item 2
- Item 3
- Item 4
Nota: aclaración
Monoespaciado
letter kit
Agenda
I. Consola rails
II. Modelo & base de datos
III. Controladores & rutas
IV. Servicios
V. Pro-tips
Consola rails 📺
- Rails viene con una utilidad de línea de comandos que nos ayuda a generar un montón de código, así como tareas de mantenimiento y gestión de DB.
- Los comandos más útiles:
$ rails console
$ rails server
$ rails generate
$ rails dbconsole
$ rails new app_name [options]
Consola rails 📺
Up & running!
$ rails new my_api --api
$ bundle install
$ rails server
Consola rails
Muchos más en:
MODELO 📋
- Para generar un modelo desde la línea de comandos:
$ rails g[enerate] model ModelName [prop_1]:[datatype] ...
MODELO: tipos de datos activerecord
-
:binary
-
:boolean
-
:date
-
:datetime
-
:decimal
-
:float
-
:integer
-
:primary_key
-
:string
-
:text
-
:time
-
:timestamp
MODELO: migraciones
$ rails db:migrate
- Una migración es una porción de código sql que sirve de histórico de cambios
- De esta forma, todo el equipo siempre tiene una versión sincronizada de la DB en entorno dev
MODELO: ¿Qué puedo hacer con las migraciones?
- Deshacer (rollback)
- Alterar un modelo ya existente
- Tipos de datos
- Nombre de la columna
- Nuevos props
Una migración permite deshacer un cambio, o alterar a posteriori nuestro esquema de base de datos:
CONtrolador 🗺
- Para generar un controlador desde la línea de comandos:
$ rails g[enerate] controller ModelName
CONtrolador: REST
class ResourceController < ApplicationController
skip_before_action :authorize_request, only: [:index, :show]
before_action :set_resource, only: [:show, :update, :destroy]
# GET /resource
def index
...
end
# GET /resource/:id
def show
...
end
# POST /resource
def create
...
end
# PATCH /resource/:id
def update
...
end
# DELETE /resource/:id
def destroy
...
end
private
def resource_params
params.permit(:title, :description, ...)
end
def set_resource
@resource = Resource.find(params[:id])
end
end
CONtrolador: RUTA REST
# routes.rb
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
resources :jobs
end
CONtrolador: RUTA REST
jobs GET /jobs(.:format) jobs#index
POST /jobs(.:format) jobs#create
job GET /jobs/:id(.:format) jobs#show
PATCH /jobs/:id(.:format) jobs#update
PUT /jobs/:id(.:format) jobs#update
DELETE /jobs/:id(.:format) jobs#destroy
CONtrolador: RUTA REST
# routes.rb
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
resources :venues do
resources :services do
resources :reservations do
collection do
get 'availability/:date', to: 'reservations#availability'
end
end
end
resources :spaces
end
end
Servicios 🧠
¿Por qué usar servicios?
Servicios
No entienden cómo puedo estar tan obsesionado con la realidad. Eso es porque yo soy... estoy por delante de ellos. Porque ¿ellos qué hacen? Cosas con brochazos. Eso no tiene ningún mérito para mí. Eso es igual a mierda. Abstracción igual a mierda. Es así.
Antonio López, en La Hora Chanante
Servicios
Objetos
Modelos
Controladores
Servicios
Real
Abstracto
Servicios: Un patrón
class MyService
def initalize(params)
@var_1 = params[:var_1]
...
end
def call
...
end
private
def helper_function
...
end
end
Servicios: Un patrón
class UserAdmissionService
def initialize(user, mailer: AroundMailer)
@user = user
@mailer = mailer
end
def call
set_temporal_acces_code
notify_user(@user.password)
@user.status = 'admitted'
@user.save!
end
private
def set_temporal_acces_code
@user.generate_temporal_access_code
end
def notify_user(temporal_password)
AroundMailer.notify_user_accepted(@user, temporal_password).deliver
end
end
😎
Servicios: Un patrón
class AdmissionsController < ApplicationController
def accept_user
user = User.find(params[:id])
UserAdmissionService.new(user).call
json_response({ message: 'User successfuly notified' }, 200)
end
end
😎
Servicios: Un patrón
class AdmissionsController < ApplicationController
def accept_user
@user = User.find(params[:id])
@user.password = 4.times.map{ Random.rand(9) }.join(", ").tr(", ", "")
AppMailer.notify_user_accepted(@user, temporal_password).deliver
@user.status = 'admitted'
@user.save!
json_response({ message: 'User successfuly notified' }, 200)
end
end
🤔
Servicios: Un patrón
app
└── services
└── service_module
├── example_service.rb
└── another_service.rb
pro-tips 🤓
- pry / irb
- rails console
- rails secrets & env config (yml)
- jobs asíncronos & crontab
- loggin & bughunting
- ... ?
¿¿TESTING??
GRACIAS
😀
RoR: Let's take a ride!
By mgmerino
RoR: Let's take a ride!
- 776