haciendo patria con sinatra
DESCRIPTION
Taller sobre Programación Web con Sinatra para Campus Party Bogotá '10.TRANSCRIPT
![Page 1: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/1.jpg)
Haciendo Patria (con Sinatra)Federico Builes
1
![Page 2: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/2.jpg)
2
![Page 3: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/3.jpg)
3
![Page 4: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/4.jpg)
http://www.ruby-lang.org/en/downloads/
4
![Page 5: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/5.jpg)
http://www.mysql.com/downloads/mysql/
5
![Page 6: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/6.jpg)
http://www.sqlite.org/download.html
6
![Page 7: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/7.jpg)
RubyGems
sinatrashotgundm-core
dm-do-adapterdm-migrationsdm-timestampsdm-validations
dm-sqlite-adapter (dm-mysql-adapter)
erubisheroku
$ gem install [nombre gem]
7
![Page 8: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/8.jpg)
RubyGems
[sudo] gem install sinatra shotgun dm-core dm-do-adapter dm-migrations dm-timestamps dm-validations dm-sqlite-adapter erubis heroku --no-ri --no-rdoc
8
![Page 9: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/9.jpg)
Código
$ git clone git://github.com/febuiles/cp-taller-sample.git
$ wget http://github.com/febuiles/cp-taller-sample/zipball/master
9
![Page 10: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/10.jpg)
# garage.rbrequire "rubygems"require "sinatra"
get "/" do "Hola"end
10
![Page 11: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/11.jpg)
$ ruby garage.rb# => localhost:4567
$ shotgun garage.rb# => localhost:9393
11
![Page 12: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/12.jpg)
GETPOSTPUT
DELETEHEAD
OPTIONS
12
![Page 13: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/13.jpg)
get "/items" do # ...end
post "/items" do # ...end
delete "/items" do # ...end
13
![Page 14: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/14.jpg)
GET /items - Lista de todos los itemsGET /items/new - Vista para crear nuevo itemGET /items/:id - Vista item específicoPOST /items - Crea un item nuevoDELETE /items - Elimina un itemPUT /items - Compra un item
14
![Page 15: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/15.jpg)
# garage.rb
get "/" doend
get "/items" doend
get "/items/new" doend
get "/items/:id" doend
post "/items" doend
delete "/items" doend
put "/items" doend
15
![Page 16: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/16.jpg)
get "/items/:id" doend
/items/1/items/foo
16
![Page 17: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/17.jpg)
Item
- id PK- title String- author String- description Text- price String- category String- sold Boolean
17
![Page 18: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/18.jpg)
# models.rbclass Item include DataMapper::Resource
property :id, Serial property :title, String property :author, String property :description, Text property :category, String property :price, String, :default => "20000" property :sold, Boolean, :default => falseend
18
![Page 19: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/19.jpg)
# models.rbrequire 'dm-core'require 'dm-migrations'require 'dm-validations'
configure :development do DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/data.db") # DataMapper::setup(:default, "mysql://user:pwd@localhost/mi_db")end
class Item include DataMapper::Resource
property :id, Serial property :title, String property :author, String property :description, Text property :category, String property :price, String, :default => "20000" property :sold, Boolean, :default => falseend
Item.auto_upgrade!
19
![Page 20: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/20.jpg)
GET /items - Lista de todos los itemsGET /items/new - Vista para crear nuevo itemGET /items/:id - Vista item específicoPOST /items - Crea un item nuevoDELETE /items - Elimina un itemPUT /items - Compra un item
20
![Page 21: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/21.jpg)
# garage.rb require "sinatra"require "models"
get "/" do redirect "/items"end
get "/items" do @items = Item.all erb :indexend
get "/items/new" doend
get "/items/:id" doend
post "/items" doend
delete "/items" doend...
21
![Page 22: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/22.jpg)
# views/index.erb<p>Esta es mi venta de garage, hay muchas como ella pero esta es la mía.</p>
<table> <tr> <th>Producto</th> <th>Autor/Fabricante</th> <th>Vendido?</th> <th>Categoría</th> </tr>
<% @items.each do |item| %> <tr> <td><a href="/items/<%= item.id %>"><%= item.title %></a></td> <td><%= item.author %></td> <td><%= item.sold? %></td> <td><%= item.category %></td> </tr> <% end %></table>
<p>Pregunte por lo que no vea. Si está interesado en mi cuerpo también me puede escribir a <a href="[email protected]">[email protected]</a>.</p>
<p><br/><a href="/items/new">Agregar Producto</a></p>
22
![Page 23: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/23.jpg)
<a href="/items/<%= item.id %>"><%= item.title %></a>
<a href="/items/3"><%= item.title %></a>
23
![Page 24: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/24.jpg)
# models.rbrequire 'dm-core'require 'dm-migrations'require 'dm-validations'
configure :development do DataMapper.auto_upgrade! DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/data.db")end
class Item include DataMapper::Resource
property :id, Serial property :title, String property :author, String property :description, Text property :category, String property :price, String, :default => "20000" property :sold, Boolean, :default => false
def sold? sold ? "Si" : "No" endend
24
![Page 25: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/25.jpg)
GET /items - Lista de todos los itemsGET /items/new - Vista para crear nuevo itemGET /items/:id - Vista item específicoPOST /items - Crea un item nuevoDELETE /items - Elimina un itemPUT /items - Compra un item
25
![Page 26: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/26.jpg)
# garage.rb ...
get "/items/new" do @item = Item.new erb :newend
...
26
![Page 27: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/27.jpg)
# /views/new.erb<h2>Nuevo Producto</h2>
<form method="POST" action="/items"> <p> <label for="title">Titulo:</label> <input type="text" name="title" id="title" value="<%= @item.title %>" /> </p> <p> <label for="author">Autor/Fabricante:</label> <input type="text" name="author" id="fabricante" value="<%= @item.author %>" /> </p> <p> <label for="price">Precio ($):</label> <input type="text" name="price" id="price" value="<%= @item.price %>"/> </p> <p> <label for="category">Categoría:</label> <select name="category"> <option value="Libro">Libro</option> <option value="DVD">DVD</option> <option value="Drogas">Drogas</option> </select> </p> <p> <label for="description">Descripción:</label> <textarea name="description" id="description"><%= @item.description %></textarea> </p> <p><input type="submit" value="Guardar Producto" /></p></form>
27
![Page 28: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/28.jpg)
<form method="POST" action="/items">
28
![Page 29: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/29.jpg)
GET /items - Lista de todos los itemsGET /items/new - Vista para crear nuevo itemGET /items/:id - Vista item específicoPOST /items - Crea un item nuevoDELETE /items - Elimina un itemPUT /items - Compra un item
29
![Page 30: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/30.jpg)
# garage.rb
# params => { :title => Algo, :author => "Pepe", :price => "$20000".... }post "/items" do @item = Item.new(params) if @item.save redirect "/items/#{@item.id}" # => /items/1 else erb :new endend
30
![Page 31: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/31.jpg)
# garage.rb
# params => { :title => Algo, :author => "Pepe", :price => "$20000".... }post "/items" do @item = Item.new(params) if @item.save redirect "/items/#{@item.id}" # => /items/1 else erb :new endend
31
![Page 32: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/32.jpg)
# models.rb# -*- coding: utf-8 -*-
class Item include DataMapper::Resource
property :id, Serial
property :title, String property :author, String property :description, Text property :price, String, :default => "20000" property :category, String property :sold, Boolean, :default => false
validates_presence_of :title, :message => "El producto necesita un título" validates_presence_of :author, :message => "El producto necesita un autor ó fabricante" validates_presence_of :price, :message => "El precio del producto no puede estar vacío"
def sold? sold ? "Si" : "No" endend
32
![Page 33: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/33.jpg)
# /views/new.erb<h2>Nuevo Producto</h2><% if @item.errors %> <ul class="warning"> <% @item.errors.each do |error| %> <li><%= error %></li> <% end %> </ul><% end %><form method="POST" action="/items">
33
![Page 34: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/34.jpg)
GET /items - Lista de todos los itemsGET /items/new - Vista para crear nuevo itemGET /items/:id - Vista item específicoPOST /items - Crea un item nuevoDELETE /items - Elimina un itemPUT /items - Compra un item
34
![Page 35: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/35.jpg)
# garage.rb
get "/items/:id" do @item = Item.get(params[:id]) erb :showend
35
![Page 36: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/36.jpg)
# views/show.erb<h2><%= @item.title %></h2><h3><%= @item.category %></h3><p><%= @item.description %> <em>$<%= @item.price %></em></p>
<p> <%= buy_item_link(@item) %> <%= delete_item_link(@item) %></p>
36
![Page 37: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/37.jpg)
37
![Page 38: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/38.jpg)
<form action="/items" method="post"> <input type="hidden" name="_method" value="put" /> <input type="hidden" name="id" value="7" /> <input type="submit" value="Comprar" /> </form>
<form action="/items" method="post"> <input type="hidden" name="_method" value="delete" /> <input type="hidden" name="id" value="7" /> <input type="submit" value="Eliminar" /> </form>
38
![Page 39: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/39.jpg)
# garage.rbhelpers do
def buy_item_link(item) html = <<HTML<form action="/items" method="post"> <input type="hidden" name="_method" value="put" /> <input type="hidden" name="id" value="#{item.id}" /> <input type="submit" value="Comprar" /></form>HTML html if !item.nil? end
def delete_item_link(item) html = <<HTML<form action="/items" method="post"> <input type="hidden" name="_method" value="delete" /> <input type="hidden" name="id" value="#{item.id}" /> <input type="submit" value="Eliminar" /></form>HTML html if !item.nil? endend
39
![Page 40: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/40.jpg)
<h2><%= @item.title %></h2><h3><%= @item.category %></h3><p><%= @item.description %> <em>$<%= @item.price %></em></p>
<p> <%= buy_item_link(@item) %> <%= delete_item_link(@item) %></p>
40
![Page 41: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/41.jpg)
GET /items - Lista de todos los itemsGET /items/new - Vista para crear nuevo itemGET /items/:id - Vista item específicoPOST /items - Crea un item nuevoDELETE /items - Elimina un itemPUT /items - Compra un item
41
![Page 42: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/42.jpg)
# garage.rbdelete "/items" do item = Item.get(params[:id]) item.destroy unless item.nil?
redirect "/items"end
42
![Page 43: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/43.jpg)
# views/index.erb<p>Esta es mi venta de garage, hay muchas como ella pero esta es la mía.</p>
<table> <tr> <th>Producto</th> <th>Autor/Fabricante</th> <th>Vendido?</th> <th>Categoría</th> </tr>
<% @items.each do |item| %> <tr> <td><a href="/items/<%= item.id %>"><%= item.title %></a></td> <td><%= item.author %></td> <td><%= item.sold? %></td> <td><%= item.category %></td> <td><%= buy_item_link(item) unless item.sold %></td> </tr> <% end %></table>
<p>Pregunte por lo que no vea. Si está interesado en mi cuerpo también me puede escribir a <a href="[email protected]">[email protected]</a>.</p>
43
![Page 44: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/44.jpg)
GET /items - Lista de todos los itemsGET /items/new - Vista para crear nuevo itemGET /items/:id - Vista item específicoPOST /items - Crea un item nuevoDELETE /items - Elimina un itemPUT /items - Compra un item
44
![Page 45: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/45.jpg)
# garage.rbput "/items" do item = Item.get(params[:id]) error 500 if item.nil?
if item.sell @items = Item.all @notice = "Felicitaciones por la compra de: #{item.title}" erb :index else not_found("No encontramos el producto que intentas comprar") endend
45
![Page 46: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/46.jpg)
# models.rb
class Item include DataMapper::Resource
property :id, Serial
property :title, String property :author, String property :description, Text property :price, String, :default => "20000" property :category, String property :sold, Boolean, :default => false
validates_presence_of :title, :message => "El producto necesita un título" validates_presence_of :author, :message => "El producto necesita un autor ó fabricante" validates_presence_of :price, :message => "El precio del producto no puede estar vacío"
def sold? sold ? "Si" : "No" end
def sell self.sold = true save endend
46
![Page 47: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/47.jpg)
# garage.rbput "/items" do item = Item.get(params[:id]) error 500 if item.nil?
if item.sell @items = Item.all @notice = "Felicitaciones por la compra de: #{item.title}" erb :index else not_found("No encontramos el producto que intentas comprar") endend
47
![Page 48: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/48.jpg)
# views/index.erb<p>Esta es mi venta de garage, hay muchas como ella pero esta es la mía.</p>
<% if @notice %> <span class="notice"><%= @notice %></span><% end %>
<table> <tr> <th>Producto</th> <th>Autor/Fabricante</th> <th>Vendido?</th> <th>Categoría</th> </tr>
<% @items.each do |item| %> <tr> <td><a href="/items/<%= item.id %>"><%= item.title %></a></td> <td><%= item.author %></td> <td><%= item.sold? %></td> <td><%= item.category %></td> <td><%= buy_item_link(item) unless item.sold %></td> </tr> <% end %></table>
<p>Pregunte por lo que no vea. Si está interesado en mi cuerpo también me puede escribir a <a href="[email protected]">[email protected]</a>.</p>
48
![Page 49: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/49.jpg)
# garage.rbrequire "sinatra"require "models"
before do content_type :html, :charset => 'utf-8'end
get "/" do redirect "/items"end
49
![Page 50: Haciendo Patria con Sinatra](https://reader036.vdocuments.site/reader036/viewer/2022062513/554f4aa0b4c905b9508b4842/html5/thumbnails/50.jpg)
<!-- views/layout.erb --><html> <head> <link rel="stylesheet" href="/screen.css" type="text/css" media="screen" /> <title>Venta de Garage</title> </head>
<body> <h1>Venta de Garage</h1> <%= yield %> </body></html>
50