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]>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]>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]>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)
Recommended