50
Haciendo Patria (con Sinatra) Federico Builes 1

Haciendo Patria con Sinatra

Embed Size (px)

DESCRIPTION

Taller sobre Programación Web con Sinatra para Campus Party Bogotá '10.

Citation preview

Page 1: Haciendo Patria con Sinatra

Haciendo Patria (con Sinatra)Federico Builes

1

Page 2: Haciendo Patria con Sinatra

2

Page 3: Haciendo Patria con Sinatra

3

Page 7: Haciendo Patria con Sinatra

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

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

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

# garage.rbrequire "rubygems"require "sinatra"

get "/" do "Hola"end

10

Page 11: Haciendo Patria con Sinatra

$ ruby garage.rb# => localhost:4567

$ shotgun garage.rb# => localhost:9393

11

Page 12: Haciendo Patria con Sinatra

GETPOSTPUT

DELETEHEAD

OPTIONS

12

Page 13: Haciendo Patria con Sinatra

get "/items" do # ...end

post "/items" do # ...end

delete "/items" do # ...end

13

Page 14: Haciendo Patria con Sinatra

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

# 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

get "/items/:id" doend

/items/1/items/foo

16

Page 17: Haciendo Patria con Sinatra

Item

- id PK- title String- author String- description Text- price String- category String- sold Boolean

17

Page 18: Haciendo Patria con Sinatra

# 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

# 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

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

# 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

# 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

<a href="/items/<%= item.id %>"><%= item.title %></a>

<a href="/items/3"><%= item.title %></a>

23

Page 24: Haciendo Patria con Sinatra

# 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

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

# garage.rb ...

get "/items/new" do @item = Item.new erb :newend

...

26

Page 27: Haciendo Patria con Sinatra

# /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

<form method="POST" action="/items">

28

Page 29: Haciendo Patria con Sinatra

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

# 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

# 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

# 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

# /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

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

# garage.rb

get "/items/:id" do @item = Item.get(params[:id]) erb :showend

35

Page 36: Haciendo Patria con Sinatra

# 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

37

Page 38: Haciendo Patria con Sinatra

<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

# 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

<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

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

# garage.rbdelete "/items" do item = Item.get(params[:id]) item.destroy unless item.nil?

redirect "/items"end

42

Page 43: Haciendo Patria con Sinatra

# 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

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

# 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

# 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

# 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

# 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

# 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

<!-- 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