13. get "/items" do
# ...
end
post "/items" do
# ...
end
delete "/items" do
# ...
end
13
14. GET /items - Lista de todos los items
GET /items/new - Vista para crear nuevo item
GET /items/:id - Vista item específico
POST /items - Crea un item nuevo
DELETE /items - Elimina un item
PUT /items - Compra un item
14
15. # garage.rb
get "/" do
end
get "/items" do
end
get "/items/new" do
end
get "/items/:id" do
end
post "/items" do
end
delete "/items" do
end
put "/items" do
end
15
17. Item
- id PK
- title String
- author String
- description Text
- price String
- category String
- sold Boolean
17
18. # models.rb
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
end
18
19. # models.rb
require '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 => false
end
Item.auto_upgrade!
19
20. GET /items - Lista de todos los items
GET /items/new - Vista para crear nuevo item
GET /items/:id - Vista item específico
POST /items - Crea un item nuevo
DELETE /items - Elimina un item
PUT /items - Compra un item
20
21. # garage.rb
require "sinatra"
require "models"
get "/" do
redirect "/items"
end
get "/items" do
@items = Item.all
erb :index
end
get "/items/new" do
end
get "/items/:id" do
end
post "/items" do
end
delete "/items" do
end
...
21
22. # 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="federico@mheroin.com">federico@mheroin.com</a>.
</p>
<p><br/><a href="/items/new">Agregar Producto</a></p>
22
24. # models.rb
require '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"
end
end
24
25. GET /items - Lista de todos los items
GET /items/new - Vista para crear nuevo item
GET /items/:id - Vista item específico
POST /items - Crea un item nuevo
DELETE /items - Elimina un item
PUT /items - Compra un item
25
29. GET /items - Lista de todos los items
GET /items/new - Vista para crear nuevo item
GET /items/:id - Vista item específico
POST /items - Crea un item nuevo
DELETE /items - Elimina un item
PUT /items - Compra un item
29
30. # 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
end
end
30
31. # 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
end
end
31
32. # 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"
end
end
32
33. # /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
34. GET /items - Lista de todos los items
GET /items/new - Vista para crear nuevo item
GET /items/:id - Vista item específico
POST /items - Crea un item nuevo
DELETE /items - Elimina un item
PUT /items - Compra un item
34
41. GET /items - Lista de todos los items
GET /items/new - Vista para crear nuevo item
GET /items/:id - Vista item específico
POST /items - Crea un item nuevo
DELETE /items - Elimina un item
PUT /items - Compra un item
41
42. # garage.rb
delete "/items" do
item = Item.get(params[:id])
item.destroy unless item.nil?
redirect "/items"
end
42
43. # 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="federico@mheroin.com">federico@mheroin.com</a>.
</p>
43
44. GET /items - Lista de todos los items
GET /items/new - Vista para crear nuevo item
GET /items/:id - Vista item específico
POST /items - Crea un item nuevo
DELETE /items - Elimina un item
PUT /items - Compra un item
44
45. # garage.rb
put "/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")
end
end
45
46. # 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
end
end
46
47. # garage.rb
put "/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")
end
end
47
48. # 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="federico@mheroin.com">federico@mheroin.com</a>.
</p>
48