ruby on railsftp.gul.uc3m.es/pub/gul/cursos/2008/marzo/ruby on rails/rubyonrails... · el plan os...
TRANSCRIPT
Ruby on RailsDesarrollo web que no duele
Sergio Gil
El plan
El planOs cuento por qué os puede
interesar Ruby on Rails unos 40’
Nos arremangamos para picar código y os enseño cómo se
hacen algunas cosashasta que nos
echen =;-)
Os doy referencias para seguir, y me aplaudís
sólo 5’ más(de verdad)
El planOs cuento por qué os puede
interesar Ruby on Rails unos 40’
Nos arremangamos para picar código y os enseño cómo se
hacen algunas cosashasta que nos
echen =;-)
Os doy referencias para seguir, y me aplaudís
sólo 5’ más(de verdad)
El planOs cuento por qué os puede
interesar Ruby on Rails unos 40’
Nos arremangamos para picar código y os enseño cómo se
hacen algunas cosashasta que nos
echen =;-)
Os doy referencias para seguir, y me aplaudís
sólo 5’ más(de verdad)
Ruby
Ruby
• Creado en Japón en los 90
Ruby
• Creado en Japón en los 90• Interpretado
Ruby
• Creado en Japón en los 90• Interpretado• Dinámico
Ruby
• Creado en Japón en los 90• Interpretado• Dinámico• Orientado a objetos
Ruby
• Creado en Japón en los 90• Interpretado• Dinámico• Orientado a objetos• Mola =;-)
Ruby
5.timesdoputs'¡Fácil!'end
5.timesdoputs'¡Fácil!'end
• Cercano a nuestra forma de pensar
5.timesdoputs'¡Fácil!'end
• Cercano a nuestra forma de pensar• Lo cual da una experiencia mejor
5.timesdoputs'¡Fácil!'end
• Cercano a nuestra forma de pensar• Lo cual da una experiencia mejor• Te hace sentir inteligente
5.timesdoputs'¡Fácil!'end
• Cercano a nuestra forma de pensar• Lo cual da una experiencia mejor• Te hace sentir inteligente• ¡Es divertido!
Rails
Ruby on Rails
• Framework de desarrollo web
Ruby on Rails
• Framework de desarrollo web• Creado por David Heinemeier Hanson
(37signals)
Ruby on Rails
• Framework de desarrollo web• Creado por David Heinemeier Hanson
(37signals)• Extraído de su aplicación Basecamp
Ruby on Rails
• Framework de desarrollo web• Creado por David Heinemeier Hanson
(37signals)• Extraído de su aplicación Basecamp• Liberado en 2005
Ruby on Rails
Colección de patrones resueltos
¿Cuántas veces has hecho...
Colección de patrones resueltos
¿Cuántas veces has hecho...
Colección de patrones resueltos
¿Cuántas veces has hecho...
Colección de patrones resueltos
¿Cuántas veces has hecho...
Colección de patrones resueltos
¿Cuántas veces has hecho...
Colección de patrones resueltos
¿Cuántas veces has hecho...
Framework “con opinión”
Hacer fácil lo correcto...
...y difícil lo incorrecto
“si es feo, probablemente está mal”
La Comunidad
ModeloVista
Controlador
MVC
Convention Over Configuration
Convención: norma sin efecto real directo, salvo el beneficio que se obtiene de que todos
los agentes la sigan
classUser<ActiveRecord::Base
has_many:articles,:class_name=>"Article"end
classArticle<ActiveRecord::Base
belongs_to:user,:class_name=>"User"end
classUser<ActiveRecord::Baseset_table_name"users"
has_many:articles,:class_name=>"Article",:foreign_key=>"user_id"end
classArticle<ActiveRecord::Baseset_table_name"articles"
belongs_to:user,:class_name=>"User",:foreign_key=>"user_id"end
classUser<ActiveRecord::Baseset_table_name"users"set_primary_key"id"has_many:articles,:class_name=>"Article",:foreign_key=>"user_id"end
classArticle<ActiveRecord::Baseset_table_name"articles"set_primary_key"id"belongs_to:user,:class_name=>"User",:foreign_key=>"user_id"end
classUser<ActiveRecord::Base
has_many:articles,:class_name=>"Article",:foreign_key=>"user_id"end
classArticle<ActiveRecord::Base
belongs_to:user,:class_name=>"User",:foreign_key=>"user_id"end
classUser<ActiveRecord::Base
has_many:articlesend
classArticle<ActiveRecord::Base
belongs_to:userend
classUser<ActiveRecord::Base
has_many:articles,:class_name=>"Article"end
classArticle<ActiveRecord::Base
belongs_to:user,:class_name=>"User"end
classUser<ActiveRecord::Baseset_table_name"users"
has_many:articles,:class_name=>"Article",:foreign_key=>"user_id"end
classArticle<ActiveRecord::Baseset_table_name"articles"
belongs_to:user,:class_name=>"User",:foreign_key=>"user_id"end
classUser<ActiveRecord::Base
has_many:articles,:class_name=>"Article",:foreign_key=>"user_id"end
classArticle<ActiveRecord::Base
belongs_to:user,:class_name=>"User",:foreign_key=>"user_id"end
classUser<ActiveRecord::Base
has_many:articlesend
classArticle<ActiveRecord::Base
belongs_to:userend
classUser<ActiveRecord::Base
has_many:articles,:class_name=>"Article"end
classArticle<ActiveRecord::Base
belongs_to:user,:class_name=>"User"end
classUser<ActiveRecord::Base
has_many:articles,:class_name=>"Article",:foreign_key=>"user_id"end
classArticle<ActiveRecord::Base
belongs_to:user,:class_name=>"User",:foreign_key=>"user_id"end
classUser<ActiveRecord::Base
has_many:articlesend
classArticle<ActiveRecord::Base
belongs_to:userend
classUser<ActiveRecord::Base
has_many:articles,:class_name=>"Article"end
classArticle<ActiveRecord::Base
belongs_to:user,:class_name=>"User"end
classUser<ActiveRecord::Base
has_many:articlesend
classArticle<ActiveRecord::Base
belongs_to:userend
classUser<ActiveRecord::Base
has_many:articlesend
classArticle<ActiveRecord::Base
belongs_to:userend
classUser<ActiveRecord::Base
has_many:articlesend
classArticle<ActiveRecord::Base
belongs_to:userend
classUser<ActiveRecord::Basehas_many:articlesend
classArticle<ActiveRecord::Basebelongs_to:userend
classUser<ActiveRecord::Basehas_many:articlesend
classArticle<ActiveRecord::Basebelongs_to:userend
Don’t Repeat Yourself
ActionController::Routing::Routes.drawdo|map|map.article':year/:title',:controller=>'articles',:action=>'show'map.connect':controller/:action/:id'end
link_to(article.title,article_url(:year=>article.date.year,:title=>article.title))
config/routes.rb
app/views/articles/index.rhtml
<ahref="/2007/rails">rails</a>
Y además
Testing integrado
Testing integradoPlugins
Testing integradoPlugins
Migraciones
Testing integradoPlugins
MigracionesORM avanzado
Testing integradoPlugins
MigracionesORM avanzado
REST
Testing integradoPlugins
MigracionesORM avanzado
RESTAJAX
Testing integradoPlugins
MigracionesORM avanzado
RESTAJAX
Capistrano
¡A trabajar!
$railsmyapp
Entorno de desarrollo integrado
Entorno de desarrollo integrado
• Estructura de directorios predeterminada
Entorno de desarrollo integrado
• Estructura de directorios predeterminada
• Generadores
Entorno de desarrollo integrado
• Estructura de directorios predeterminada
• Generadores
• Entornos de desarrollo, testing y producción
Entorno de desarrollo integrado
• Estructura de directorios predeterminada
• Generadores
• Entornos de desarrollo, testing y producción
• ¡He dicho testing!
Entorno de desarrollo integrado
• Estructura de directorios predeterminada
• Generadores
• Entornos de desarrollo, testing y producción
• ¡He dicho testing!
• Logs
Entorno de desarrollo integrado
• Estructura de directorios predeterminada
• Generadores
• Entornos de desarrollo, testing y producción
• ¡He dicho testing!
• Logs
• $script/console
Entorno de desarrollo integrado
• Estructura de directorios predeterminada
• Generadores
• Entornos de desarrollo, testing y producción
• ¡He dicho testing!
• Logs
• $script/console
• $script/server
Entorno de desarrollo integrado
• Estructura de directorios predeterminada
• Generadores
• Entornos de desarrollo, testing y producción
• ¡He dicho testing!
• Logs
• $script/console
• $script/server
• Rakefile
ActiveRecord
ActiveRecord• Capa de modelo (acceso a base de
datos)
ActiveRecord• Capa de modelo (acceso a base de
datos)
• ORM (Object Relational Mapping)
ActiveRecord• Capa de modelo (acceso a base de
datos)
• ORM (Object Relational Mapping)
• Tabla = Clase
ActiveRecord• Capa de modelo (acceso a base de
datos)
• ORM (Object Relational Mapping)
• Tabla = Clase
• Fila = Instancia
ActiveRecord• Capa de modelo (acceso a base de
datos)
• ORM (Object Relational Mapping)
• Tabla = Clase
• Fila = Instancia
• Columna = Atributo/Método
ActiveRecord• Capa de modelo (acceso a base de
datos)
• ORM (Object Relational Mapping)
• Tabla = Clase
• Fila = Instancia
• Columna = Atributo/Método
• A tope con las convenciones
ActiveRecord• Capa de modelo (acceso a base de
datos)
• ORM (Object Relational Mapping)
• Tabla = Clase
• Fila = Instancia
• Columna = Atributo/Método
• A tope con las convenciones
Más features de ActiveRecord
Más features de ActiveRecord
• Migraciones
Más features de ActiveRecord
• Migraciones
• Relaciones simples y complejas
Más features de ActiveRecord
• Migraciones
• Relaciones simples y complejas
• Validaciones
Más features de ActiveRecord
• Migraciones
• Relaciones simples y complejas
• Validaciones
• Callbacks
Más features de ActiveRecord
• Migraciones
• Relaciones simples y complejas
• Validaciones
• Callbacks
• acts_as_list,acts_as_tree,acts_as_*
class Person < ActiveRecord::Base has_many :articles validates_presence_of :name, :message => "es un campo obligatorio" before_save :log private def log logger.info "Guardada una persona llamada #{self.name}" endend
MVC en Rails
Ciclo de una petición
config/routes.rb
ActionController::Routing::Routes.draw do |map| map.connect "blog", :controller => "posts", :action => "index" map.connect "", :controller => "site", :action => "home" map.connect "blog/:year/:month/:day/:title", :controller => "posts", :action => "show" # default route -> map.connect ':controller/:action/:id'end
Controladores
• 1 Controlador = 1 Clase que herede de ApplicationController
• 1 Acción = 1 método público
• Filtros
class ExampleController < ApplicationController before_filter :greeting before_filter :random_access, :only => :show def list @people = Person.find(:all) end def show @person = Person.find(params[:id]) end private def greeting @greeting = "Hello" end def random_access rand > 0.5 end end
Vistas
Vistas
• Nombre y ubicación por convención
Vistas
• Nombre y ubicación por convenciónapp/views/<controlador>/<acción>.<formato>.<motor>
Vistas
• Nombre y ubicación por convenciónapp/views/<controlador>/<acción>.<formato>.<motor>
• Erb: HTML con Ruby incrustado
Vistas
• Nombre y ubicación por convenciónapp/views/<controlador>/<acción>.<formato>.<motor>
• Erb: HTML con Ruby incrustado<h1><%= @post.title %></h1>
Vistas
• Nombre y ubicación por convenciónapp/views/<controlador>/<acción>.<formato>.<motor>
• Erb: HTML con Ruby incrustado<h1><%= @post.title %></h1>
• Layouts
Vistas
• Nombre y ubicación por convenciónapp/views/<controlador>/<acción>.<formato>.<motor>
• Erb: HTML con Ruby incrustado<h1><%= @post.title %></h1>
• Layouts
• Helpers
app/views/layouts/application.html.erb
<html> <head> <title>Aplicación de ejemplo</title> </head> <body> <%= yield %> </body></html>
app/views/example/list.html.erb
<ul> <% for person in @people %> <li><%= link_to person.name, :action => 'show', :id => person.id %></li> <% end %></ul>
Helpers
Helpers
• Generación de rutas
Helpers
• Generación de rutas
• Formularios
Helpers
• Generación de rutas
• Formularios
• Formateo de datos
Helpers
• Generación de rutas
• Formularios
• Formateo de datos
• Paginación
Helpers
• Generación de rutas
• Formularios
• Formateo de datos
• Paginación
• ...
Testing integradoPlugins
MigracionesORM avanzado
RESTAJAX
Capistrano
¡Me apunto!
Lista de correo en español
http://lists.simplelogica.net/mailman/listinfo/ror‐es
Entonces, ¿Rails es la solución a todos
los problemas?
NO
NOPero sí una herramienta útil
para muchos; tenla en tu arsenal y úsala cuando
corresponda
¿Y escala?
Sí.
¿Preguntas?
Muchas graciassergio.gil@the‐cocktail.com
lacoctelera.com/porras
the‐cocktail.com
Créditos fotográficosLars Kristian Flem (http://www.flickr.com/photos/larskflem/46551303/) (CC)Michel Kuik (http://www.flickr.com/photos/michelkuik/161160973/) (CC)Ale Muñoz (http://www.sofanaranja.com/)Brillantine Sánchez (http://www.flickr.com/photos/brilliantly/534331230)Robert Parviainen (http://flickr.com/photos/rtv/290062998/) (CC)Sean Dwyer (http://www.flickr.com/photos/dwired/1414217985/) (CC)