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