Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Haciendo Patria (con Sinatra)

febuiles
January 09, 2012

Haciendo Patria (con Sinatra)

Sinatra workshop given at Campus Party '10, Bogotá.

febuiles

January 09, 2012
Tweet

More Decks by febuiles

Other Decks in Programming

Transcript

  1. Haciendo Patria (con Sinatra)
    Federico Builes
    1

    View full-size slide

  2. http://www.ruby-lang.org/en/downloads/
    4

    View full-size slide

  3. http://www.mysql.com/downloads/mysql/
    5

    View full-size slide

  4. http://www.sqlite.org/download.html
    6

    View full-size slide

  5. RubyGems
    sinatra
    shotgun
    dm-core
    dm-do-adapter
    dm-migrations
    dm-timestamps
    dm-validations
    dm-sqlite-adapter
    (dm-mysql-adapter)
    erubis
    heroku
    $ gem install [nombre gem]
    7

    View full-size slide

  6. 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

    View full-size slide

  7. Código
    $ git clone git://github.com/febuiles/cp-taller-sample.git
    $ wget http://github.com/febuiles/cp-taller-sample/zipball/master
    9

    View full-size slide

  8. # garage.rb
    require "rubygems"
    require "sinatra"
    get "/" do
    "Hola"
    end
    10

    View full-size slide

  9. $ ruby garage.rb
    # => localhost:4567
    $ shotgun garage.rb
    # => localhost:9393
    11

    View full-size slide

  10. GET
    POST
    PUT
    DELETE
    HEAD
    OPTIONS
    12

    View full-size slide

  11. get "/items" do
    # ...
    end
    post "/items" do
    # ...
    end
    delete "/items" do
    # ...
    end
    13

    View full-size slide

  12. 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

    View full-size slide

  13. # 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

    View full-size slide

  14. get "/items/:id" do
    end
    /items/1
    /items/foo
    16

    View full-size slide

  15. Item
    - id PK
    - title String
    - author String
    - description Text
    - price String
    - category String
    - sold Boolean
    17

    View full-size slide

  16. # 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

    View full-size slide

  17. # 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

    View full-size slide

  18. 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

    View full-size slide

  19. # 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

    View full-size slide

  20. # views/index.erb
    Esta es mi venta de garage, hay muchas como ella pero esta es la mía.


    Producto
    Autor/Fabricante
    Vendido?
    Categoría

    <% @items.each do |item| %>

    <%= item.title %>
    <%= item.author %>
    <%= item.sold? %>
    <%= item.category %>

    <% end %>

    Pregunte por lo que no vea. Si está interesado en mi cuerpo también me puede escribir a
    [email protected].


    Agregar Producto
    22

    View full-size slide

  21. <%= item.title %>
    <%= item.title %>
    23

    View full-size slide

  22. # 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

    View full-size slide

  23. 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

    View full-size slide

  24. # garage.rb
    ...
    get "/items/new" do
    @item = Item.new
    erb :new
    end
    ...
    26

    View full-size slide

  25. # /views/new.erb
    Nuevo Producto


    Titulo:



    Autor/Fabricante:



    Precio ($):



    Categoría:

    Libro
    DVD
    Drogas



    Descripción:
    <%= @item.description %>



    27

    View full-size slide

  26. 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

    View full-size slide

  27. # 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

    View full-size slide

  28. # 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

    View full-size slide

  29. # 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

    View full-size slide

  30. # /views/new.erb
    Nuevo Producto
    <% if @item.errors %>

    <% @item.errors.each do |error| %>
    <%= error %>
    <% end %>

    <% end %>

    33

    View full-size slide

  31. 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

    View full-size slide

  32. # garage.rb
    get "/items/:id" do
    @item = Item.get(params[:id])
    erb :show
    end
    35

    View full-size slide

  33. # views/show.erb
    <%= @item.title %>
    <%= @item.category %>
    <%= @item.description %>
    $<%= @item.price %>


    <%= buy_item_link(@item) %>
    <%= delete_item_link(@item) %>

    36

    View full-size slide

  34. # garage.rb
    helpers do
    def buy_item_link(item)
    html = <

    View full-size slide

  35. <%= @item.title %>
    <%= @item.category %>
    <%= @item.description %>
    $<%= @item.price %>


    <%= buy_item_link(@item) %>
    <%= delete_item_link(@item) %>

    40

    View full-size slide

  36. 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

    View full-size slide

  37. # garage.rb
    delete "/items" do
    item = Item.get(params[:id])
    item.destroy unless item.nil?
    redirect "/items"
    end
    42

    View full-size slide

  38. # views/index.erb
    Esta es mi venta de garage, hay muchas como ella pero esta es la mía.


    Producto
    Autor/Fabricante
    Vendido?
    Categoría

    <% @items.each do |item| %>

    <%= item.title %>
    <%= item.author %>
    <%= item.sold? %>
    <%= item.category %>
    <%= buy_item_link(item) unless item.sold %>

    <% end %>

    Pregunte por lo que no vea. Si está interesado en mi cuerpo también me puede escribir a
    [email protected].

    43

    View full-size slide

  39. 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

    View full-size slide

  40. # 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

    View full-size slide

  41. # 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

    View full-size slide

  42. # 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

    View full-size slide

  43. # views/index.erb
    Esta es mi venta de garage, hay muchas como ella pero esta es la mía.
    <% if @notice %>
    <%= @notice %>
    <% end %>


    Producto
    Autor/Fabricante
    Vendido?
    Categoría

    <% @items.each do |item| %>

    <%= item.title %>
    <%= item.author %>
    <%= item.sold? %>
    <%= item.category %>
    <%= buy_item_link(item) unless item.sold %>

    <% end %>

    Pregunte por lo que no vea. Si está interesado en mi cuerpo también me puede escribir a
    [email protected].

    48

    View full-size slide

  44. # garage.rb
    require "sinatra"
    require "models"
    before do
    content_type :html, :charset => 'utf-8'
    end
    get "/" do
    redirect "/items"
    end
    49

    View full-size slide




  45. media="screen" />
    Venta de Garage


    Venta de Garage
    <%= yield %>


    50

    View full-size slide