Introducción a Ruby on Rails

Preview:

DESCRIPTION

Introducción a Rails

Citation preview

no olviden apagar sus celulares

#=> sobre rieles

?quien soy

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 = ”alvaro.pereyra@srdperu.com"=> "alvaro.pereyra@srdperu.com">> 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: "alvaro.pereyra@srdperu.com", 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)

Recommended