32
Ricardo Markiewicz <[email protected]> 1 Rolling on Rails Primeros Pasos

Rolling On Rails

Embed Size (px)

Citation preview

Ricardo Markiewicz <[email protected]>1

Rolling on Rails

Primeros Pasos

Ricardo Markiewicz <[email protected]>2

¿Qué es Ruby?

� Lenguaje de scripting

� Netamente orientado a objetos

� No tipado / Duck Typing

� Orientado a “mensajes”

� Creador: Yukihiro Matsumoto (a.k.a Matz)

Si camina como un pato, nada como un pato y hace "quack",

podemos tratarlo como un pato. James Whitcomb Riley

Ricardo Markiewicz <[email protected]>3

Tipos de Datos

Ricardo Markiewicz <[email protected]>4

Tipos de Datos

� Array : [“hola”, “mundo”]

– puts [“hola”, “mundo”].join(“ “)�

� Hash : {:key => value}

� Rangos : 1..2 , 3..4 , etc

– (1..2).to_a => [1,2]

– (1..5).include?(2) => true

Ricardo Markiewicz <[email protected]>5

Símbolos vs Strings

� “hola” vs :hola

� Diferencias?, veamos un ejemplo :

– A = “hola” # A.object_id = 21066960

– B = “hola” # B.object_id = 21066730

– C = :hola # C.object_id = 132178

– D = :hola # C.object_id = 132178

� Regla de oro :

– Si el contenido del objeto es lo importante, usa un string.

– Si la identidad del objeto es importante, usa un símbolo.

Ricardo Markiewicz <[email protected]>6

Clases

� class Nombre ; end

� attr_reader, attr_writer y attr_accesor

� Herencia simple : class Gato < Mamifero

� No hay overloading

� Hay overriding

� Niveles de acceso : Public, Private, Protected

� method_missing

Ricardo Markiewicz <[email protected]>7

Open Classes

� Todas las clases en ruby estan abierta a modificacion en cualquier momento

� Ejemplo : Agregandole un metodo a la clase String :class String

def to_xml

“<string>#{self.to_s}</string>”

end

end

Ricardo Markiewicz <[email protected]>8

Módulos

� Agrupa funciones bajo un mismo nombre

� Por ejemplo Math.sin(Math.PI)

– Math es el nombre del modulo (module Math)

– sin es una función (def sin(x))

– PI es una constantes (PI=3.14)

� Utilidad? Podemos mezclar clases y módulos ☺

Ricardo Markiewicz <[email protected]>9

Ejemplo

Vamos al código

Ricardo Markiewicz <[email protected]>10

Exceptions

� Lanzamiento

– raise “Error no esperado!”

– raise ArgumentError, “error” unless x.is_a? Numeric

� Captura

– begin : Inicia un bloque donde puede ser lanzada una exception

– eescue : Seria el catch (puede haber varios

– else : Si ninguna matchea

Ricardo Markiewicz <[email protected]>11

@@types@@ class variable

Constant uppercase constant

nombrelowercase or _ local local variable

@nombre@ instance variable

$global $ global variable

ExamplePrefixScope

Scope

Ricardo Markiewicz <[email protected]>12

Ruby On RailsRuby On Rails

Agile Web Development

Ricardo Markiewicz <[email protected]>13

¿Qué es?

� Framework para el desarrollo de aplicaciones web

� Utiliza el patrón MVC

� Realizado por David Heinemeier Hansson

� Primer versión en 2004

� Extiende Ruby por donde lo miremos– 2.days + 2.weeks => 16 days

– 2.megabytes

Ricardo Markiewicz <[email protected]>14

� DRY - Don’t Repeat Yourself

– “Write once, use everywere”, suena conocido, no?

� Convention Over Configuration

– Todo tiene su convención

– Si queremos hacerlo de otra forma podemos, pero hay que escribir más ☺

Principios

Ricardo Markiewicz <[email protected]>15

Model

� ORM utiliza el patrón Active Record

– http://en.wikipedia.org/wiki/Active_record_pattern

– “is a design pattern frequently found in enterprise applications”

– Mapea dbtable => class, dbcol => attr

� Convenciones

– Todos los campos van en minúsculas

– Toda tabla tiene un “id” unique Autoincrement

– FK : “Nombre de tabla en singular” + “_id”

� user_id, photo_id

Ricardo Markiewicz <[email protected]>16

– Nombre de tablas en plural, nombre clase en singular

– Idioma ingles !! (se puede pluralizar en castellano por medio de un plugin)

� Rails agrega métodos a String (mixin) para pluralizar / singularizar

– “person”.pluralize => “people”

– “cars”.singularize => “car”

Model

Ricardo Markiewicz <[email protected]>17

� One-to-One– has_one :other (TABLA REFERENCIADA)

– belongs_to :other (TABLA CON LA FK)

� One-to-Many– has_many :others (TABLA REFERENCIADA)

– belongs_to :other (TABLA CON LA FK)

� Many-to-Many (Join table)– has_and_belongs_to :others (AMBAS TABLAS

REFERENCIADAS)

– NombrePlural1_NombrePlural2 en orden alfabético

Relaciones

Ricardo Markiewicz <[email protected]>18

Validaciones

� Valida automáticamente

� Siempre es bueno usar las herramientas del DB Server

� validate

� validate_on_create

� validate_on_update

� validates_acceptance_of

� validates_associated

� validates_confirmation_of

� validates_each

� validates_exclusion_of

� validates_format_of

� validates_inclusion_of

� validates_length_of

� validates_numericality_of

� validates_presence_of

� validates_size_of

� validates_uniqueness_of

� Tambien podemos crearvalidaciones propias

Ejemplo

class Person < ActiveRecord::Basevalidates_acceptance_of :terms_of_servicevalidates_acceptance_of :eula, :message => “msg“# Compara contra password_confirmationvalidates_confirmation_of :password

validates_exclusion_of :age, :in => 30..60

validates_inclusion_of :age, :in => 0..99

validates_format_of :email , :on => create

validates_length_of :first_name, :maximum=>30

validates_numericality_of :value, :on => :create

validates_presence_of :first_namevalidates_uniqueness_of :user_name, :scope => :account_id

end

Ricardo Markiewicz <[email protected]>20

� Mapea URL a la llamada de métodos

� Convenciones

– Nombrar como NombrePluralController

– Metodos CRUD : index, show, new, create, edit, update, destroy

Controller

Ricardo Markiewicz <[email protected]>21

Controllers

� Inicializacion (lo hace el framework)�– Carga say_controller.rb– Instancia SayController.– Si existe say_helper.rb, el módulo SayController se “mixea”

con la instancia– Carga el modelo say.rb si existe

� Que obtenemos– Routing the requests– Session tracking– Filtering and Verification– Caching

Ricardo Markiewicz <[email protected]>22

Routing the requests

� El mapeo de rutas está en config/routes.rb

– map.connect ':controller/:action/:id‘

– map.resources :users

– map.login ‘/login’, :controller => ‘’, :action => ‘’

� La primera se mantiene por compatibilidad, pero ahora se usa REST

� Veremos mas ejemplos de rutas sobre el código, que es donde mejor entendemos :)

Ricardo Markiewicz <[email protected]>23

Pero… ¿qué es REST?

� REpresentational State Transfer� Se usa para describir “recursos” sobre los que se

pueden realizar “acciones”� Nombrado por Roy Fielding en su tesis de Ph.D.� Se aprovecha de los verbos HTTP : GET, POST,

DELETE y PUT– PUT : actualización de datos de un recurso– DELETE : eliminar un recurso

� No es un estándar� REST is just an architectural style

Ricardo Markiewicz <[email protected]>24

Ejemplos de REST

� GET /articles

– Método : index

– Lista todos los artículos

� GET /articles/1

– Método : show

– Muestra 1 articulo

� GET /articles/new

– Método : new

– Crear un nuevo articulo

� POST /articles

– Método : create

– Salva un nuevo articulo

� PUT /articles/1

– Método : update

– Actualiza un articulo

� DELETE /articles/1

– Método : destroy

– Elimina un articulo

Ricardo Markiewicz <[email protected]>25

Formmated REST!

# GET /projects

# GET /projects.xml

def show

@projects = Project.find(:all)

respond_to do |format|

format.html # show.rhtml

format.xml {

render :xml = > @projects.to_xml

}

end

end

Ricardo Markiewicz <[email protected]>26

Session Tracking

� Multibackend : Cookies, DB, Filesystem

� Métodos session y cookie para acceder a los datos

– user_id = session[:user_id]

– En versiones viejas se usaba @session pero se depreco en Rails 2.0

� En los métodos además tenemos paramsque referencia a los parámetros que nos pasan por la URL

Ricardo Markiewicz <[email protected]>27

Filtering and Verification

� before_filter, after_filter

– Nos permiten definir funciones a llamar antes y después de la ejecución del método de un controller

– Actúan casi horizontalmente (alguien dijo Aspectos?)�

– Si un filtro retorna FALSE, se aborta la cadena

� Verify

– Similar, pero para verificar cosas simples, como un valor en el session

Ricardo Markiewicz <[email protected]>28

Ejemplos

before_filter :check_user, only => [:create, :destroy]

before_filter :foo_bar, except => :index

verify :only => :post_comment,

:session => :user_id,

:redirect_to => :index

Ricardo Markiewicz <[email protected]>29

Caching

� Varios niveles de cache ya en el framework

� Mejoran performance, reducen carga en la DB, precompila templates

� Niveles

– Page Caching

– Fragment Caching (nuevo en rails 2.0)�

– Query Caching

– Action Caching

� El tema da para una charla aparte :)�

Ricardo Markiewicz <[email protected]>30

View

� Se encarga de crear el HTML para el cliente

� Multi interprete / Multi formato

– erb : Genera HTML y se codea en Ruby

– Liquid : Muy bonito, rapido, seguro y extensible

– rjs : Genera javascript desde codigo Ruby

– El interprete que se usa depende de la extension :

� index.html.erb, index.html.liquid, index.js.rjs

� Se usan helpers para ayudar a la vista de modo de no tener necesidad de trasladar logica a ella.

Ricardo Markiewicz <[email protected]>31

View

� Helpers de ActionView– form_for

– div_for

– link_to

– link_to_remote

– text_fields_tag, text_area_tag, etc

– Y muuucho mas

� Custom Helpers– Se ponen en app/helpers y se nombran como

ControllerNameHelper. Son modulos (mixins)

Ricardo Markiewicz <[email protected]>32

Coding Fast

� Tendremos tiempo todavia?