Download - Introducción a Ruby on Rails
no olviden apagar sus celulares
#=> sobre rieles
?quien soy
alvaro [email protected]
www.cristalab.com/devatwork
programo
escribo
juego
leo
wtf?
conociéndolos
developers
web developers
+
ルビは日本からきました
entendiendo rails
pero antes, un desvío
framework web
¿por qué?
Tim Berners-Lee
orientada a documentos
HTTP + HTML
GET /reports POST /reports/new
UPDATE /reports/1DELETE /reports/1
<img>
informativa
<form>
GET /reports POST /reports/new
UPDATE /reports/1DELETE /reports/1
GET /reports POST /createReport POST /updateReport POST /deleteReport
orientada a medios
orientada a mediosorientada a experiencias
orientada a procesos
nuevas necesidades
nuevas herramientas
nuevas herramientas
ahora sí...
entendiendo rails
David Heinemeir Hansson
algunos mitos y verdades
el mejor framework
es perfecto
cura el cáncer
me consiguió esposa, regaló una casa y apadrinó mis hijos
!=
full-stack
buenas prácticas
tdd mvc
mvc
orden
todo sitio en su lugar
> rails my_cool_project
separado de la presentación
!=
orientación al desarrollador
no al navegador
drydon’t repeat yourself
en todas partes
User.find(1)
en código SQL
@post = Post.find(1)
<h1><%= @post.title %></h1>
<p><%= @post.content %></p>
entre las capascontroladora
vista
script/generate model Photo
generadores
script/generate controller PhotoController
convención por sobre configuración
no hacer las tareas repetitivas
o aburridas
table users
class User < ActiveRecord::Base
end
user = User.new=> #<User id: nil, name: nil, email: nil, website: nil, crypted_password: nil, created_at: nil, updated_at: nil>
>> user.name = "Alvaro"=> "Alvaro">> user.email = ”[email protected]"=> "[email protected]">> user.website = "http://www.srdperu.com"=> "http://www.srdperu.com">> user.save=> true
>> User.find(1)=> #<User id: 1, name: "Alvaro"...>
User.find_by_name>> User.find_by_name("Alvaro")=> #<User id: 1, name: "Alvaro"...>
User_find_by_name_and_website
>> User.find_by_name_and_website("Alvaro","http://www.srdperu.com")
=> #<User id: 1, name: "Alvaro"...>
>> User.find_or_create_by_name("Pepe")=> #<User id: 2, name: “Pepe” ...>
configurable
restricciones
te liberan
mvc
map.connect ':controller/:action/:id'
config/routes.rb
Model
class User < ActiveRecord::Base
end
relaciones
class User < ActiveRecord::Basehas_many :photos
end
class Photo < ActiveRecord::Base
end
class Photo < ActiveRecord::Base belongs_to :user
end
>> user.photos=> [#<Photo id: 1, name: "Primera foto pasable", description: nil, filename: "photos/yo.jpg", user_id: 1 ...>]
>> user.photos.first.user=> #<User id: 1, name: "Alvaro", email: "[email protected]", website: "http://www.srdperu.com" ...>
>> user.photos.create=> #<Photo id: 2, name: nil, description: nil, filename: nil, user_id: 1 ...>
n - m
infanciapersonalniño
n n
infanciapersonalniño
n n
n__n
class Tag < ActiveRecord::Base
end
class PhotoTag < ActiveRecord::Base
end
class PhotoTag < ActiveRecord::Basebelongs_to :photobelongs_to :tag
end
class Photo < ActiveRecord::Basehas_many :photo_tags
end
class Photo < ActiveRecord::Basehas_many :photo_tagshas_many :tags, :through => :photo_tags
end
class Tag < ActiveRecord::Base has_many :photo_tags has_many :photos, :through => :photo_tagsend
>> photo = Photo.first
>> tag = Tag.new(:name=>"personal")
>> photo.tags << tag
>> photo.tags=> [#<Tag id: 1, name: "personal" ...>]
>> tag.photos=> [#<Photo id: 1, name: "Primera foto pasable", description: nil, filename: "photos/yo.jpg", user_id: 1 ... >]
>> photo.tags.create=> #<Tag id: 2, name: nil ... >
>> photo.tags=> [#<Tag id: 1, name: "personal", ....>, #<Tag id: 2, name: nil ....>]
>> photo.photo_tags=> [#<PhotoTag id: 1, photo_id: 1, tag_id: 1 ... >, #<PhotoTag id: 2, photo_id: 1, tag_id: 2 ... ">]
y mucho más...pero eso en otra ocasión
validaciones
class Photo < ActiveRecord::Base
validates_presence_of :name validates_numericality_of :user_id validates_associated :user
end
vista
@post = Post.find(1)
<h1><%= @post.title %></h1>
<p><%= @post.content %></p>
controladora
vista
<h1><%= @post.title %></h1>
<p><%= @post.content %></p>
ERb
<ul>
<%= @photos.each do |photo| %></h1>
<li><%= photo.name %></li>
<% end %>
</ul>
ERb
<%= link_to “Ver foto” @photo %>
Helpers
<% form_for @photo do |f| %> <%= f.text_field :name %> <%= f.text_area :description %> <%= f.submit "Agregar" %><% end %>
Helpers
<% form_for @tag do |f| %> <%= f.text_field :name %> <%= f.submit "Agregar" %><% end %>
Partials
_tag_form.html.erb
<%= render :partial=>”tag_form” %>
+
page.visual_effect :show, 'product_error'page.replace_html 'product_error', "Error"page.visual_effect :highlight, 'error'
RJS
controlador
class PhotosController < ActionController::Base
def index @photos = Photo.find(:all) end
end
convenciones
class PhotosController < ActionController::Base
def index @photos = Photo.find(:all) end
end
class PhotosController < ActionController::Base
def index @photos = Photo.find(:all) end
end
views/photos/index.html.erb
class PhotosController < ActionController::Base
def index @photos = Photo.find(:all) render :action => “catalogue” endend
class PhotosController < ActionController::Base
def index @photos = Photo.find(:all) respond_to do |format| format.html { ... } format.xml { render :xml => @photos } endend
class PhotosController < ActionController::Base
def catalogue ... enddef show_photo ... enddef create_new_photo ... enddef save ... enddef remove_photo ... end
REST
GET /photos POST /photos/create
UPDATE /photos/1 DELETE /photos/1
map.resource :photos
config/routes.rb
class PhotosController < ActionController::Base
def index ... enddef new ... enddef create ... enddef edit ... enddef update ... enddef destroy ... end
end
ninguna viñeta ha sido dañada en esta presentación
¿preguntas?(todavía falta para el almuerzo)
¿preguntas?(todavía falta para el almuerzo)