Ruby On Rails
Ruby On Rails
Sergio Gil
El plan
El plan
Os cuento por qué os puede unos 40’
interesar Ruby on Rails
class
Article
<
ActiveRecord::Base
set_table_name
"articles"
set_primary_key
"id"
belongs_to
:user,
:class_name
=>
"User"
belongs_to
:user,
:class_name
=>
"User",
:foreign_key
=>
"user_id"
belongs_to
:user
end
class
User
<
ActiveRecord::Base
set_table_name
"users"
has_many
:articles,
:class_name
=>
"Article"
has_many
:articles,
:class_name
=>
"Article",
:foreign_key
=>
"user_id"
has_many
:articles
end
class
Article
<
ActiveRecord::Base
set_table_name
"articles"
belongs_to
:user,
:class_name
=>
"User"
belongs_to
:user,
:class_name
=>
"User",
:foreign_key
=>
"user_id"
belongs_to
:user
end
class
User
<
ActiveRecord::Base
has_many
:articles,
:class_name
=>
"Article"
has_many
:articles,
:class_name
=>
"Article",
:foreign_key
=>
"user_id"
has_many
:articles
end
class Article < ActiveRecord::Base
belongs_to
:user,
:class_name
=>
"User"
belongs_to
:user,
:class_name
=>
"User",
:foreign_key
=>
"user_id"
belongs_to
:user
end
class
User
<
ActiveRecord::Base
has_many
:articles,
:class_name
=>
"Article"
has_many
:articles
end
class Article < ActiveRecord::Base
belongs_to
:user,
:class_name
=>
"User"
belongs_to
:user
end
class
User
<
ActiveRecord::Base
has_many
:articles
end
class Article < ActiveRecord::Base
belongs_to
:user
end
class
User
<
ActiveRecord::Base
class
User
<
ActiveRecord::Base
has_many
:articles
has_many
:articles
end end
class
Article
<
ActiveRecord::Base class
Article
<
ActiveRecord::Base
belongs_to
:user
end
belongs_to
:user
end
class
User
<
ActiveRecord::Base
has_many
:articles
end
class
Article
<
ActiveRecord::Base
belongs_to
:user
end
Don’t Repeat
Yourself
config/routes.rb
ActionController::Routing::Routes.draw
do
|map|
map.article
':year/:title',
:controller
=>
'articles',
:action
=>
'show'
map.connect
':controller/:action/:id'
end
app/views/articles/index.rhtml
link_to(article.title,
article_url(:year
=>
article.date.year,
:title
=>
article.title))
<a
href="/2007/rails">rails</a>
Y además
Testing integrado
Testing integrado
Plugins
Testing integrado
Plugins
Migraciones
Testing integrado
Plugins
Migraciones
ORM avanzado
Testing integrado
Plugins
Migraciones
ORM avanzado
REST
Testing integrado
Plugins
Migraciones
ORM avanzado
REST
AJAX
Testing integrado
Plugins
Migraciones
ORM avanzado
REST
AJAX
Capistrano
¡A trabajar!
$
rails
myapp
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
• Generadores
• Entornos de
desarrollo, testing
y producción
Entorno de desarrollo integrado
• 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
before_save :log
private
def log
logger.info "Guardada una persona llamada #{self.name}"
end
end
MVC en Rails
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
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ón
app/views/<controlador>/<acción>.<formato>.<motor>
Vistas
• Nombre y ubicación por convención
app/views/<controlador>/<acción>.<formato>.<motor>
• Layouts
Vistas
• Nombre y ubicación por convención
app/views/<controlador>/<acción>.<formato>.<motor>
• 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 integrado
Plugins
Migraciones
ORM avanzado
REST
AJAX
Capistrano
¡Me apunto!
http://www.rubyonrails.org/
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
NO
Pero sí una herramienta útil
para muchos; tenla en tu
arsenal y úsala cuando
corresponda
¿Y escala?
Sí.
¿Preguntas?
Muchas gracias
sergio.gil@the‐cocktail.com
lacoctelera.com/porras
the‐cocktail.com
Créditos fotográficos
Lars 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)