SlideShare ist ein Scribd-Unternehmen logo
1 von 45
DESARROLLO WEB
  AVANZADO
Desarrollo rápido con Ruby on Rails




                               Miguel Fernández Fernández
Introducción a Ruby On Rails




    http://rubyonrails.org/
Un poco de Historia

  • David   Heinemeier Hansson ( 37 signals )
      2004 (1.0)

  • Agosto  2006 Apple anuncia su inclusión en
      Mac OSX 10.5 (v1.2.3)

  • Última   versión estable 2.3.5

  •   v3.0.0 en preview release (Fusión con Merb)
Filosofía

• Full   stack - Da soporte íntegro al desarrollo Web.

• Siguelos principios Convention over Configuration (CoC) y Don’t
 Repeat Yourself (DRY) (se sirve de las capacidades reflectivas
 del ruby para esto).
Visión arquitectónica (MVC)                              M ODELS , V IEWS ,   AND   C ONTROLLERS   25



                                                   !12*(.%&*1%&)0%1*&34&%#
                                                   "1'()#*(++&*1-)#&*"5#%1.-#617(0&+
                                                   #1'()#*(++&*1-)8(9&%18-&.
                          !
                                  '()#*(++&*       $1,-&.1*&)0&*%1)&:#1$*(.%&*1%5*&&)

                 $            #                "



                      ,-&.                     /(0&+                 !"#"$"%&

                                                         M ODELS , V IEWS ,   AND   C ONTROLLERS   26



                       !         B2/#;:C
                Figure 2.1: The Model-View-Controller Architecture
                                                  !'(##)*++,-./01+%#20&+"334#245"0#+678
                                      "           "'B2/#;:C'F;:3%'A#20&'52:#0211&0
                                                  #'92:#0211&0';:#&0"5#%'<;#(',23&1
                                                  $'92:#0211&0';:=2>&%'=;&<
   be a view that displays product information on a catalog page and another set
                                A#20&             %&?;&<'0&:3&0%':&@#'$02<%&0'%50&&:
   of views used by administrators to add and edit products.
                               92:#0211&0
   Controllers orchestrate $ application. Controllers receive events from the
                %          the              #
   outside world (normally user input), interact with the model, and display an
   appropriate view to the user.
                !;%)1"-                        D5#;=&'
   This triumvirate—the model, view, and controller—together form an architec-
                                                              !"#"$"%&
                 9"0#                      B&5203
   ture known as MVC. Figure 2.1 shows MVC in abstract terms.
                ?;&<                       E23&1
   MVC was originally intended for conventional GUI applications, where devel-
   opers found the separation of concerns led to far less coupling, which in turn
                            Figure 2.2: Rails and MVC
Visión arquitectónica
   (vista dinámica)
Visión arquitectónica
             (componentes)

Ruby on rails
 Core                                       Active resource

  Action pack
                          Active support




                                                               plugin

                                                                              plugin
      Action controller                      Action mailer
                                                                        ...
        Action view

        Active record                      Action webservice
Instalación de rails
• instalemos   rails y todas sus dependencias:
  •   $ sudo apt-get install subversion mysql-server-5.0
      mysql-admin libsqlite3-ruby1.8 openjdk-6-jdk

  •   $ sudo apt-get install ruby-full rubygems
      libmysql-ruby

  •   $ echo "gem: --http-proxy=http://proxy.uniovi.es:
      8888" > ~/.gemrc && sudo gem install rails

  •   $ echo "export PATH=$PATH:/var/lib/gems/1.8/bin"
      >> ~/.bashrc && source ~/.bashrc

• instalemos   netbeans 6.8 ruby. Nos facilitará la vida.
Rails.new (nuestra primera app)
$ cd && mkdir workspace && cd workspace
~/workspace$ rails holamundo
      create
      create app/controllers
      create app/helpers
      create app/models
      create app/views/layouts
      create config/environments
      create config/initializers
      create config/locales
      create db
      ...
Estructura de un proyecto rails
Estructura de un proyecto rails
Estructura de un proyecto rails
Arrancar WebRick
URLs, rutas, controladores y acciones
Para escribir nuestra primera aplicación dinámica, tenemos
que definir un controlador y una vista.




              http://railsapi.com/doc/rails-v2.3.5/
Invocando a una acción del
               controlador
    http://127.0.0.1:3000/saludador/hola

                 aplicación         controlador         acción

La convención dice que tras invocar una acción, se redirigirá a la vista
     controlador/accion dentro del directorio views...
Completando la plantilla
• Lasplantillas html se definen en un lenguaje llamado ERB. Muy
 similar a otros lenguajes de plantillas, como JSP.

• <%    expresión %> encierran expresiones ruby

• <%=  expresión %> el resultado de su evaluación se inyecta
 en el html de salida.

• Lasvariables de instancia definidas en los controladores están
 disponibles en la plantilla aun siendo privadas (introspección).

• Los
    métodos definidos en app/helpers/controlador
 también están disponibles en la plantilla.
Completando la plantilla
Desarrollo incremental e iterativo

• Crearemos una tienda on-line de
 forma incremental

• Abordaremos  el desarrollo de un
 aspecto funcional en cada iteración

• Alfinal de cada iteración tendremos
 algo que funciona.
It0 - Creación de la aplicación

• Hemos      visto como crear una aplicación: rails app_name

• Para    seguir el ritmo usaremos subversion, al final de cada
    iteración, actualizaremos a la revisión finalizada.

• Inicialmente   hacemos un checkout de la versión inicial.
    •   workspace$ svn co file:///home/${USUARIO}/svnrepos/
        skateshop/tags/it0 skateshop

•   Abrimos con netbeans la aplicación.
Some folks like to mock up web application page flows using Photoshop, Word,


¿En qué consiste? Comprador
or (shudder) HTML. I like using a pencil and paper. It’s quicker, and the cus-
tomer gets to play too, grabbing the pencil and scribbling alterations right on
the paper.
¿En qué consiste? Vendedor
                                          W HAT D EPOT D OES   66




       Figure 5.2: Flow of Seller Pages
It1. Gestionar los productos
•   En esta iteración nos encargaremos del alta, baja y modificación de los
    productos a vender.

•   Tareas:

    •   A) Preparar las bases de datos (MySQL o SQLite3)

    •   B) Crear el modelo, el controlador y vistas de mantenimento (scaffolding)

    •   C) Añadir nuevos campos

    •   D) Añadir validaciones

    •   E) Darle “un toque” de estilo
It1. B) Scaffolding
skateshop$ script/generate scaffold product
title:string description:text image_url:string
 •   el controlador: products_controller.rb (con acciones de
     mantenimiento)

 •   las vistas de mantenimiento: una por cada acción (salvo create) y layout
     común layouts/products.html.erb

 •   el modelo: products.rb y su migración inicial

 •   una ruta nueva en routes.rb

 •   un helper: products_helper.rb

 •   tests (unitarios y funcionales)
It1. C) Añadiendo nuevos campos
skateshop$ script/generate migration
add_price_to_product price:decimal
                                 class AddPriceToProduct < ActiveRecord::Migration
                                   def self.up

  El nombre importa! si la       add_column :products, :price, :decimal,
  migración empieza por          :precision=>8, :scale=>2, :default=>0
  create, creará una tabla, si     end
  empieza por add, añadirá
                                   def self.down
  una columna.                       remove_column :products, :price
                                   end
                                 end
skateshop$ rake db:migrate

 Es preciso actualizar las vistas, ya que el scaffolding no es
 dinámico (desde rails 2)
It1. D) Añadiendo validaciones
  Un producto tiene que cumplir que tiene un título, y que no
  haya más productos con el mismo; una descripción y una url
  válida para la imagen. Además tenemos que comprobar que el
  precio es positivo.
  class Product < ActiveRecord::Base
    validates_presence_of :title, :description, :image_url
    validates_uniqueness_of :title
    validates_numericality_of :price
    validate :precio_tiene_que_ser_por_lo_menos_un_centimo, :url_tiene_que_ser_una_imagen
    private
    def precio_tiene_que_ser_por_lo_menos_un_centimo
      errors.add(:price, "tiene que ser por lo menos un centimo") unless price >= 0.01
    end

    def url_tiene_que_ser_una_imagen
      unless /.(gif|jpg|png)$/i === image_url
        errors.add(:url,"tiene que ser una url para gif, jpg o png")
      end
    end
  end


http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html
It1. E) Dandole un toque de estilo
Necesitamos datos de prueba que se generen de forma
automática. Instalamos random_data y decimos a rails que la
use    skateshop$ sudo gem install random_data
Creamos una migración que cargue los datos
    class AddTestData < ActiveRecord::Migration
      def self.up
        Product.delete_all
        images=["tabla.jpg","pantalones.jpg","camiseta.jpg","zapatillas.jpg","gorra.jpg"]
        images.each do |image|
          p=Product.new :title=>
          p.title=image.gsub(".jpg"," ").capitalize
          p.description=Random.paragraphs(2)
          p.image_url="./"+image
          p.price=Random.number(100)
          p.save
        end
      end
      def self.down
        Products.delete_all
      end
    end
It1. E) Dandole un toque de estilo
El listado scaffolded no se adecua a cómo queremos que se
visualicen los datos. Modifiquémoslo y añadamos una hoja
de estilos
 <div id="product-list">
   <h1>Listing products</h1>

   <table cellpadding="5" cellspacing="0">
   <% for product in @products %>
      <tr valign="top" class="<%= cycle('par', 'impar') %>">
           <td>
           <%= image_tag product.image_url, :class => 'list-image' %>
           </td>
           <td width="60%">
               <span class="list-title"><%=hproduct.title %></span><br />
                    <%=h truncate(product.description.gsub(/<.*?>/,''), 80) %>
           </td>
           <td class="list-actions">
             <%= link_to 'Show', product %>
             <%= link_to 'Edit', edit_product_path(product) %>
              <%= link_to 'Destroy', product, :confirm => "Seguro?", :method=>:delete %>
            </td>
        </tr>
   <% end %>
   </table>
 </div>
It 2. Confeccionar el catálogo

•   En esta iteración nos encargaremos de confeccionar el catálogo, creando un
    controlador y un conjunto de vistas personalizadas. Veremos cómo usar helpers
    y disparar acciones desde la vista.,

•   Tareas:

    •   A) Crear el catálogo

    •   B) Diseñar el layout
It2 A) Crear el catálogo
•   El catálogo se mostrará en la home del sitio.        class Product < ActiveRecord::Base

                                                           def self.method_missing sym, args=nil
    •   generamos el controlador store con la                pattern=/find_sorted_by_/i
                                                             if sym.to_s =~ pattern
        acción index (desde Netbeans para                      find :all, :order=>
        variar)                                          sym.to_s.gsub(pattern,"").to_sym
                                                             else
                                                               super.method_missing(sym, *args)
    •   modificamos routes.rb para indicar que                end
                                                           end
        el home es la acción index del                   #resto de la clase
        controlador y borrar el fichero                   end
        index.html. [check]
                                                         class StoreController <
                                                         ApplicationController
    •   En la acción del controlador recuperamos
                                                           def index
        todos los productos, para pasarlos a la vista.       @products=Product.find_sorted_by_title
        Lo haremos à-la rails: mediante reflexión           end
        computacional.
                                                         end
It2 A) Crear el catálogo
                           <h1>Product Catalog</h1>

                           <div id="product-catalog">
                             <% @products.each do |product| %>
                             <div class="product <%=cycle("even","odd")%>">
                               <div id="product-image">
                                 <%= image_tag product.image_url, :alt=>product.title%>
                               </div>
•   La vista mostrará el
                               <div id="product-description">
    catálogo en forma de          <h3 class="product-title"><%=h product.title %></h3>
    listado                       <p class="product-description"><%=h
                           truncate(product.description,200,"...") %></p>
                                  <span class="price"><%=h product.price%></span>
                               </div>
                             </div>
                             <% end %>
                           </div>
                           <% content_for :extra do %>
                             Powered by Ruby On Rails
                           <%end%>
It2 B) Diseñar el layout
                               <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                                                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-
                               transitional.dtd">
                               <html>
                               <head>
                                 <title>Skateshop <%= @page_title && ":: "+@page_title %> </title>
                                 <%= stylesheet_link_tag "shop", :media => "all" %></head>
•   La web necesita de un      <body id="store">
    diseño consistente           <div id="banner">
                                   <%= image_tag("skate_logo.png") %>
                                   <%= @page_title || "Skateshop" %>
•   Debemos de crear un            <span id="extra"><%= yield :extra %></span>
                                 </div>
    layout (una plantilla) cuyo  <div id="columns">
    contenido variará en           <div id="side">
    función de la vista concreta      <a href="http://www....">Home</a><br />
                                      <a href="http://www..../faq">Questions</a><br />
    que se esté renderizando.         <a href="http://www..../news">News</a><br />
                                      <a href="http://www..../contact">Contact</a><br />
                                   </div>
                                   <div id="main">
                                     <%= yield :layout %>
                                   </div>
                                 </div>
                               </body>
                               </html>
It 3. Crear el carrito

•   En esta iteración veremos cómo gestionar sesiones desde el framework,
    haciéndolas persistentes. Aplicaremos lo aprendido a la creación de un carrito
    de la compra. Tareas

    •   A) Añadir productos al carrito

    •   B) Configurar la gestión de Sesiones

    •   C) Confeccionar el carrito

    •   D) Gestionar errores
It3 A) Añadir productos al carrito
Queremos poder añadir cada producto del catálogo al
carrito.
Podemos usar el built-in helper button_to(value,args),
similar a link_to
<%= button_to "Add to Cart", :action => :add_to_cart, :id => product %>




Los helpers built-in que pueden ser usados en las vistas
están definidos en las clases
ActionView::Helpers::*Helper
It 3. Gestión de sesiones
•   HTTP es stateless, pero se usan mecanismos. Para simular estados se
    usan mecanismos como URL rewriting, hidden input fields y cookies.

•   Rails usa cookies para identificar diferentes peticiones asociadas a la
    misma sesión de navegación.

•   El objeto session nos abstrae de este mecanismo (se comporta
    como un hash).

•   Por defecto session persiste en disco. Pero hay otros mecanismos:
    persistencia en memoria, en base de datos, DRb...
It 3 B). Configurar la gestión de
              sesiones
Usaremos persistencia de sesiones en base de datos.
Rails ofrece una tarea rake para esto.
  ~/skateshop$ rake db:sessions:create
  && rake db:migrate
Además tendremos que indicar en config/environment.rb
que queremos usar este tipo de persistencia, ya que el
tipo por omisión es en ficheros de texto en disco.
  config.action_controller.session_store = :active_record_store


Los cambios en otros directorios distintos de app y public
requieren reiniciar el servidor. Reiniciamos
It3 C) Confeccionar el carrito
Necesitamos definir una acción en el controlador para obtener el carrito de
sesión y añadirle productos.
                  class StoreController < ApplicationController

                    def index
                      @products=Product.find_sorted_by_title
                    end

                    def add_to_cart
                      @cart=find_cart
                      @cart.add_product Product.find(params[:id])
                    end

                    def empty_cart
                      session[:cart]=nil
                      flash[:notice]="Your car is empty"
                      redirect_to :action => :index
                    end

                    private

                    def find_cart
                      session[:cart] ||= Cart.new
                    end
                  end
It3 C) Confeccionar el carrito
             Y definir la propia clase carrito, que es un almacén de productos.
class Cart
                                                             class CartItem
                                                               attr_reader :product, :quantity
  attr_reader :items

                                                               def initialize(product)
  def initialize
                                                                 @product=product
    @items=[]
                                                                 @quantity=1
  end
                                                               end
  def add_product(product)
                                                               def title
    item = items.find { |item| item.title==product.title }
                                                                 product.title
    if item
                                                               end
      item.increment_quantity
    else
                                                               def price
      @items << CartItem.new(product)
                                                                 product.price * quantity
    end
                                                               end
  end

                                                               def increment_quantity
  def total_price
                                                                 @quantity+=1
    @items.sum{ |item| item.price }
                                                               end
  end
                                                             end
end
It3 C) Confeccionar el carrito
       Además habrá que definir una vista que nos muestre el carrito.

<div class="cart-title">Your Cart</div>
<table>
  <% for item in @cart.items %>
    <tr>
      <td><%= item.quantity %>&times;</td>
      <td><%=h item.title %></td>
      <td class="item-price"><%= en_euros(item.price) %></td>
    </tr>
  <% end %>

 <tr class="total-line">
   <td colspan="2">Total</td>
   <td class="total-cell"><%= en_euros(@cart.total_price) %></td>
 </tr>

</table>

<%= button_to "Empty cart", :action => :empty_cart %>
It3 D) Gestionar Errores
 Echemos un vistazo a los últimos mapeos de routes.rb
       map.connect ':controller/:action/:id'
Automáticamente lo que va después de la acción se mapea al
parámetro id.
     http://localhost:3000/store/add_to_cart/fake
          Couldn't find Product with ID=fake
   def add_to_cart
      @cart=find_cart
      begin
        @cart.add_product Product.find(params[:id])
      rescue ActiveRecord::RecordNotFound => e
        logger.error("Se intentó acceder al producto con
   id=#{params[:id]}")
        flash[:notice]="Oooops, we could't process your request"
        redirect_to :action=>:index
      end
    end
It4. Una pizca de AJAX
•   En esta iteración aprenderemos a usar renderizado parcial de vistas, a actualizar
    dinámicamente la página con AJAX, y a manipuilar el DOM.

•   Tareas:

    •   A) Refactorizar el carrito

    •   B) Carrito basado en AJAX

    •   C) Resaltar los cambios

    •   D) Ocultar el carrito cuando está vacío

    •   E) Hacer que el carrito funcione cuando Javascript está deshabilitado
It5. Gestionar la compra


•   En esta iteración aprenderemos a conectar tablas del modelo con claves
    ajenas. Usar las relaciones belongs_to y has_many. A crear formularios basados
    en modelos y a conectar dichos furmularios, con los modelos y las vistas.

•   Tareas:

    •   A) Caputurar una orden de compra
It6. Gestionar los usuarios

•   En esta iteración aprenderemos a añadir autenticación a una sesión de usuario,
    a usar transacciones y crear un hook que añade nueva funcionalidad a
    ActiveRecord

•   Tareas:

    •   A) Añadir Usuarios

    •   B) Autenticación

    •   C) Controlar el acceso
Posibles prácticas
•   Notable

    •   Crear una pequeña aplicación de gestión básica.

    •   Añadir funcionalidad de subscripción y envío de newsletters a la aplicación
        existente (http://guides.rubyonrails.org/action_mailer_basics.html)

    •   Añadir cualquier funcionalidad no trivial a la aplicación mediante plugins:
        (eg. paginación y búsqueda en vistas de listados)

•   Sobresaliente

    •   Instalar los frameworks de pruebas BDD Rspec y Cucumber y diseñar e
        implementar un caso de uso dirigido por la prueba.

    •   Crear un plugin de rails (http://guides.rubyonrails.org/plugins.html)
Referencias
•   http://guides.rubyonrails.org/

•   http://railsapi.com/doc/rails-v2.3.5/

•   http://www.erikveen.dds.nl/distributingrubyapplications/rails.html

•   Agile Web Development with Rails, Third Edition (The Pragmatic Bookshelf)

•   The Rails Way (Addison-Wesley Professional)

•   Deploying Rails Applications: A Step-By-Step Guide (The Pragmatic Bookshelf)

•   Rails Cookbook (O`reilly)

•   Behaviour driven development with RSpec, Cucumber and Friends (The Pragmatic
    Bookshelf)
Gracias



miguelff@innova.uniovi.es

Weitere ähnliche Inhalte

Was ist angesagt?

Curso Java Avanzado 1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado   1 IntroduccióN Al Desarrollo WebCurso Java Avanzado   1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado 1 IntroduccióN Al Desarrollo WebEmilio Aviles Avila
 
JBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server FacesJBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server FacesAitor Acedo
 
Ejercicio basico jsf’s
Ejercicio basico jsf’sEjercicio basico jsf’s
Ejercicio basico jsf’sayreonmx
 
2. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-20062. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-2006Samuel Marrero
 
Programacion web java
Programacion web javaProgramacion web java
Programacion web javaCésar Ocampo
 
4/9 Curso JEE5, Soa, Web Services, ESB y XML
4/9 Curso JEE5, Soa, Web Services, ESB y XML4/9 Curso JEE5, Soa, Web Services, ESB y XML
4/9 Curso JEE5, Soa, Web Services, ESB y XMLJuan Carlos Rubio Pineda
 
Introducción a Laravel 5 - Un Framework para Artesanos Web
Introducción a Laravel 5 - Un Framework para Artesanos WebIntroducción a Laravel 5 - Un Framework para Artesanos Web
Introducción a Laravel 5 - Un Framework para Artesanos WebFacundo E. Goñi Perez
 
Desarrollo Web con Kohana Framework PHP
Desarrollo Web con Kohana Framework PHPDesarrollo Web con Kohana Framework PHP
Desarrollo Web con Kohana Framework PHPJavier López López
 
Javaserver Faces (jsf)
Javaserver Faces (jsf)Javaserver Faces (jsf)
Javaserver Faces (jsf)Enrique Polo
 

Was ist angesagt? (20)

Asp.net
Asp.netAsp.net
Asp.net
 
Curso Java Avanzado 1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado   1 IntroduccióN Al Desarrollo WebCurso Java Avanzado   1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado 1 IntroduccióN Al Desarrollo Web
 
Ejercicio basico en asp.net LOZADA ERICK
Ejercicio basico en asp.net LOZADA ERICKEjercicio basico en asp.net LOZADA ERICK
Ejercicio basico en asp.net LOZADA ERICK
 
JBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server FacesJBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server Faces
 
Ejercicio basico jsf’s
Ejercicio basico jsf’sEjercicio basico jsf’s
Ejercicio basico jsf’s
 
2. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-20062. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-2006
 
Curso Java Avanzado 3 Js Ps
Curso Java Avanzado   3 Js PsCurso Java Avanzado   3 Js Ps
Curso Java Avanzado 3 Js Ps
 
Asp.net
Asp.netAsp.net
Asp.net
 
Curso Java Avanzado 2 Servlets
Curso Java Avanzado   2 ServletsCurso Java Avanzado   2 Servlets
Curso Java Avanzado 2 Servlets
 
Programacion web java
Programacion web javaProgramacion web java
Programacion web java
 
Servicios web
Servicios webServicios web
Servicios web
 
4/9 Curso JEE5, Soa, Web Services, ESB y XML
4/9 Curso JEE5, Soa, Web Services, ESB y XML4/9 Curso JEE5, Soa, Web Services, ESB y XML
4/9 Curso JEE5, Soa, Web Services, ESB y XML
 
ASP.NET
ASP.NETASP.NET
ASP.NET
 
Introducción a Kohana Framework
Introducción a Kohana FrameworkIntroducción a Kohana Framework
Introducción a Kohana Framework
 
Servicios web
Servicios webServicios web
Servicios web
 
Taller desarrollo web
Taller  desarrollo webTaller  desarrollo web
Taller desarrollo web
 
Introducción a Laravel 5 - Un Framework para Artesanos Web
Introducción a Laravel 5 - Un Framework para Artesanos WebIntroducción a Laravel 5 - Un Framework para Artesanos Web
Introducción a Laravel 5 - Un Framework para Artesanos Web
 
Desarrollo Web con Kohana Framework PHP
Desarrollo Web con Kohana Framework PHPDesarrollo Web con Kohana Framework PHP
Desarrollo Web con Kohana Framework PHP
 
Javaserver Faces (jsf)
Javaserver Faces (jsf)Javaserver Faces (jsf)
Javaserver Faces (jsf)
 
Dce2 ejercicios asp.net
Dce2 ejercicios asp.netDce2 ejercicios asp.net
Dce2 ejercicios asp.net
 

Ähnlich wie Rails intro

Ruby On Rails Intro
Ruby On Rails IntroRuby On Rails Intro
Ruby On Rails IntroThirdWay
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Airespeterpunk
 
Reportes En J Developer Parte 1 Y 2
Reportes En J Developer   Parte 1 Y 2Reportes En J Developer   Parte 1 Y 2
Reportes En J Developer Parte 1 Y 2Steven Gomez
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETAlberto Diaz Martin
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netAlberto Diaz Martin
 
Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Nelson Rojas Núñez
 
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)lenny
 
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)INSIGNIA4U
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Ricard Luquero
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryDavid Arango
 
Efc programación .net-luis fernando aguas - 22012022 1700
Efc programación .net-luis fernando aguas - 22012022 1700Efc programación .net-luis fernando aguas - 22012022 1700
Efc programación .net-luis fernando aguas - 22012022 1700Luis Fernando Aguas Bucheli
 
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...Corporacion de Industrias Tecnologicas S.A.
 
Programa en Rails como si Jugases con Lego. Javier Ramirez
Programa en Rails como si Jugases con Lego. Javier RamirezPrograma en Rails como si Jugases con Lego. Javier Ramirez
Programa en Rails como si Jugases con Lego. Javier Ramirezjavier ramirez
 

Ähnlich wie Rails intro (20)

Ruby On Rails Intro
Ruby On Rails IntroRuby On Rails Intro
Ruby On Rails Intro
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
 
Angular js
Angular jsAngular js
Angular js
 
Reportes En J Developer Parte 1 Y 2
Reportes En J Developer   Parte 1 Y 2Reportes En J Developer   Parte 1 Y 2
Reportes En J Developer Parte 1 Y 2
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NET
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009
 
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
 
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQuery
 
Jquery Hmvc
Jquery HmvcJquery Hmvc
Jquery Hmvc
 
Efc programación .net-luis fernando aguas - 22012022 1700
Efc programación .net-luis fernando aguas - 22012022 1700Efc programación .net-luis fernando aguas - 22012022 1700
Efc programación .net-luis fernando aguas - 22012022 1700
 
Presentacion web2py
Presentacion web2pyPresentacion web2py
Presentacion web2py
 
Mi app-asp-net-mvc2
Mi app-asp-net-mvc2Mi app-asp-net-mvc2
Mi app-asp-net-mvc2
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
 
Spring Mvc Final
Spring Mvc FinalSpring Mvc Final
Spring Mvc Final
 
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
 
Programa en Rails como si Jugases con Lego. Javier Ramirez
Programa en Rails como si Jugases con Lego. Javier RamirezPrograma en Rails como si Jugases con Lego. Javier Ramirez
Programa en Rails como si Jugases con Lego. Javier Ramirez
 

Mehr von Miguel Fernández

Mehr von Miguel Fernández (6)

Hierarchical taxonomy extraction
Hierarchical taxonomy extractionHierarchical taxonomy extraction
Hierarchical taxonomy extraction
 
Yahoo! pipes
Yahoo! pipesYahoo! pipes
Yahoo! pipes
 
Real-time web
Real-time webReal-time web
Real-time web
 
Screen scraping
Screen scrapingScreen scraping
Screen scraping
 
App engine
App engineApp engine
App engine
 
Ruby intro
Ruby introRuby intro
Ruby intro
 

Rails intro

  • 1. DESARROLLO WEB AVANZADO Desarrollo rápido con Ruby on Rails Miguel Fernández Fernández
  • 2. Introducción a Ruby On Rails http://rubyonrails.org/
  • 3. Un poco de Historia • David Heinemeier Hansson ( 37 signals ) 2004 (1.0) • Agosto 2006 Apple anuncia su inclusión en Mac OSX 10.5 (v1.2.3) • Última versión estable 2.3.5 • v3.0.0 en preview release (Fusión con Merb)
  • 4. Filosofía • Full stack - Da soporte íntegro al desarrollo Web. • Siguelos principios Convention over Configuration (CoC) y Don’t Repeat Yourself (DRY) (se sirve de las capacidades reflectivas del ruby para esto).
  • 5. Visión arquitectónica (MVC) M ODELS , V IEWS , AND C ONTROLLERS 25 !12*(.%&*1%&)0%1*&34&%# "1'()#*(++&*1-)#&*"5#%1.-#617(0&+ #1'()#*(++&*1-)8(9&%18-&. ! '()#*(++&* $1,-&.1*&)0&*%1)&:#1$*(.%&*1%5*&&) $ # " ,-&. /(0&+ !"#"$"%& M ODELS , V IEWS , AND C ONTROLLERS 26 ! B2/#;:C Figure 2.1: The Model-View-Controller Architecture !'(##)*++,-./01+%#20&+"334#245"0#+678 " "'B2/#;:C'F;:3%'A#20&'52:#0211&0 #'92:#0211&0';:#&0"5#%'<;#(',23&1 $'92:#0211&0';:=2>&%'=;&< be a view that displays product information on a catalog page and another set A#20& %&?;&<'0&:3&0%':&@#'$02<%&0'%50&&: of views used by administrators to add and edit products. 92:#0211&0 Controllers orchestrate $ application. Controllers receive events from the % the # outside world (normally user input), interact with the model, and display an appropriate view to the user. !;%)1"- D5#;=&' This triumvirate—the model, view, and controller—together form an architec- !"#"$"%& 9"0# B&5203 ture known as MVC. Figure 2.1 shows MVC in abstract terms. ?;&< E23&1 MVC was originally intended for conventional GUI applications, where devel- opers found the separation of concerns led to far less coupling, which in turn Figure 2.2: Rails and MVC
  • 6. Visión arquitectónica (vista dinámica)
  • 7. Visión arquitectónica (componentes) Ruby on rails Core Active resource Action pack Active support plugin plugin Action controller Action mailer ... Action view Active record Action webservice
  • 8. Instalación de rails • instalemos rails y todas sus dependencias: • $ sudo apt-get install subversion mysql-server-5.0 mysql-admin libsqlite3-ruby1.8 openjdk-6-jdk • $ sudo apt-get install ruby-full rubygems libmysql-ruby • $ echo "gem: --http-proxy=http://proxy.uniovi.es: 8888" > ~/.gemrc && sudo gem install rails • $ echo "export PATH=$PATH:/var/lib/gems/1.8/bin" >> ~/.bashrc && source ~/.bashrc • instalemos netbeans 6.8 ruby. Nos facilitará la vida.
  • 9. Rails.new (nuestra primera app) $ cd && mkdir workspace && cd workspace ~/workspace$ rails holamundo create create app/controllers create app/helpers create app/models create app/views/layouts create config/environments create config/initializers create config/locales create db ...
  • 10. Estructura de un proyecto rails
  • 11. Estructura de un proyecto rails
  • 12. Estructura de un proyecto rails
  • 14. URLs, rutas, controladores y acciones Para escribir nuestra primera aplicación dinámica, tenemos que definir un controlador y una vista. http://railsapi.com/doc/rails-v2.3.5/
  • 15. Invocando a una acción del controlador http://127.0.0.1:3000/saludador/hola aplicación controlador acción La convención dice que tras invocar una acción, se redirigirá a la vista controlador/accion dentro del directorio views...
  • 16. Completando la plantilla • Lasplantillas html se definen en un lenguaje llamado ERB. Muy similar a otros lenguajes de plantillas, como JSP. • <% expresión %> encierran expresiones ruby • <%= expresión %> el resultado de su evaluación se inyecta en el html de salida. • Lasvariables de instancia definidas en los controladores están disponibles en la plantilla aun siendo privadas (introspección). • Los métodos definidos en app/helpers/controlador también están disponibles en la plantilla.
  • 18. Desarrollo incremental e iterativo • Crearemos una tienda on-line de forma incremental • Abordaremos el desarrollo de un aspecto funcional en cada iteración • Alfinal de cada iteración tendremos algo que funciona.
  • 19. It0 - Creación de la aplicación • Hemos visto como crear una aplicación: rails app_name • Para seguir el ritmo usaremos subversion, al final de cada iteración, actualizaremos a la revisión finalizada. • Inicialmente hacemos un checkout de la versión inicial. • workspace$ svn co file:///home/${USUARIO}/svnrepos/ skateshop/tags/it0 skateshop • Abrimos con netbeans la aplicación.
  • 20. Some folks like to mock up web application page flows using Photoshop, Word, ¿En qué consiste? Comprador or (shudder) HTML. I like using a pencil and paper. It’s quicker, and the cus- tomer gets to play too, grabbing the pencil and scribbling alterations right on the paper.
  • 21. ¿En qué consiste? Vendedor W HAT D EPOT D OES 66 Figure 5.2: Flow of Seller Pages
  • 22. It1. Gestionar los productos • En esta iteración nos encargaremos del alta, baja y modificación de los productos a vender. • Tareas: • A) Preparar las bases de datos (MySQL o SQLite3) • B) Crear el modelo, el controlador y vistas de mantenimento (scaffolding) • C) Añadir nuevos campos • D) Añadir validaciones • E) Darle “un toque” de estilo
  • 23. It1. B) Scaffolding skateshop$ script/generate scaffold product title:string description:text image_url:string • el controlador: products_controller.rb (con acciones de mantenimiento) • las vistas de mantenimiento: una por cada acción (salvo create) y layout común layouts/products.html.erb • el modelo: products.rb y su migración inicial • una ruta nueva en routes.rb • un helper: products_helper.rb • tests (unitarios y funcionales)
  • 24. It1. C) Añadiendo nuevos campos skateshop$ script/generate migration add_price_to_product price:decimal class AddPriceToProduct < ActiveRecord::Migration def self.up El nombre importa! si la add_column :products, :price, :decimal, migración empieza por :precision=>8, :scale=>2, :default=>0 create, creará una tabla, si end empieza por add, añadirá def self.down una columna. remove_column :products, :price end end skateshop$ rake db:migrate Es preciso actualizar las vistas, ya que el scaffolding no es dinámico (desde rails 2)
  • 25. It1. D) Añadiendo validaciones Un producto tiene que cumplir que tiene un título, y que no haya más productos con el mismo; una descripción y una url válida para la imagen. Además tenemos que comprobar que el precio es positivo. class Product < ActiveRecord::Base validates_presence_of :title, :description, :image_url validates_uniqueness_of :title validates_numericality_of :price validate :precio_tiene_que_ser_por_lo_menos_un_centimo, :url_tiene_que_ser_una_imagen private def precio_tiene_que_ser_por_lo_menos_un_centimo errors.add(:price, "tiene que ser por lo menos un centimo") unless price >= 0.01 end def url_tiene_que_ser_una_imagen unless /.(gif|jpg|png)$/i === image_url errors.add(:url,"tiene que ser una url para gif, jpg o png") end end end http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html
  • 26. It1. E) Dandole un toque de estilo Necesitamos datos de prueba que se generen de forma automática. Instalamos random_data y decimos a rails que la use skateshop$ sudo gem install random_data Creamos una migración que cargue los datos class AddTestData < ActiveRecord::Migration def self.up Product.delete_all images=["tabla.jpg","pantalones.jpg","camiseta.jpg","zapatillas.jpg","gorra.jpg"] images.each do |image| p=Product.new :title=> p.title=image.gsub(".jpg"," ").capitalize p.description=Random.paragraphs(2) p.image_url="./"+image p.price=Random.number(100) p.save end end def self.down Products.delete_all end end
  • 27. It1. E) Dandole un toque de estilo El listado scaffolded no se adecua a cómo queremos que se visualicen los datos. Modifiquémoslo y añadamos una hoja de estilos <div id="product-list"> <h1>Listing products</h1> <table cellpadding="5" cellspacing="0"> <% for product in @products %> <tr valign="top" class="<%= cycle('par', 'impar') %>"> <td> <%= image_tag product.image_url, :class => 'list-image' %> </td> <td width="60%"> <span class="list-title"><%=hproduct.title %></span><br /> <%=h truncate(product.description.gsub(/<.*?>/,''), 80) %> </td> <td class="list-actions"> <%= link_to 'Show', product %> <%= link_to 'Edit', edit_product_path(product) %> <%= link_to 'Destroy', product, :confirm => "Seguro?", :method=>:delete %> </td> </tr> <% end %> </table> </div>
  • 28. It 2. Confeccionar el catálogo • En esta iteración nos encargaremos de confeccionar el catálogo, creando un controlador y un conjunto de vistas personalizadas. Veremos cómo usar helpers y disparar acciones desde la vista., • Tareas: • A) Crear el catálogo • B) Diseñar el layout
  • 29. It2 A) Crear el catálogo • El catálogo se mostrará en la home del sitio. class Product < ActiveRecord::Base def self.method_missing sym, args=nil • generamos el controlador store con la pattern=/find_sorted_by_/i if sym.to_s =~ pattern acción index (desde Netbeans para find :all, :order=> variar) sym.to_s.gsub(pattern,"").to_sym else super.method_missing(sym, *args) • modificamos routes.rb para indicar que end end el home es la acción index del #resto de la clase controlador y borrar el fichero end index.html. [check] class StoreController < ApplicationController • En la acción del controlador recuperamos def index todos los productos, para pasarlos a la vista. @products=Product.find_sorted_by_title Lo haremos à-la rails: mediante reflexión end computacional. end
  • 30. It2 A) Crear el catálogo <h1>Product Catalog</h1> <div id="product-catalog"> <% @products.each do |product| %> <div class="product <%=cycle("even","odd")%>"> <div id="product-image"> <%= image_tag product.image_url, :alt=>product.title%> </div> • La vista mostrará el <div id="product-description"> catálogo en forma de <h3 class="product-title"><%=h product.title %></h3> listado <p class="product-description"><%=h truncate(product.description,200,"...") %></p> <span class="price"><%=h product.price%></span> </div> </div> <% end %> </div> <% content_for :extra do %> Powered by Ruby On Rails <%end%>
  • 31. It2 B) Diseñar el layout <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1- transitional.dtd"> <html> <head> <title>Skateshop <%= @page_title && ":: "+@page_title %> </title> <%= stylesheet_link_tag "shop", :media => "all" %></head> • La web necesita de un <body id="store"> diseño consistente <div id="banner"> <%= image_tag("skate_logo.png") %> <%= @page_title || "Skateshop" %> • Debemos de crear un <span id="extra"><%= yield :extra %></span> </div> layout (una plantilla) cuyo <div id="columns"> contenido variará en <div id="side"> función de la vista concreta <a href="http://www....">Home</a><br /> <a href="http://www..../faq">Questions</a><br /> que se esté renderizando. <a href="http://www..../news">News</a><br /> <a href="http://www..../contact">Contact</a><br /> </div> <div id="main"> <%= yield :layout %> </div> </div> </body> </html>
  • 32. It 3. Crear el carrito • En esta iteración veremos cómo gestionar sesiones desde el framework, haciéndolas persistentes. Aplicaremos lo aprendido a la creación de un carrito de la compra. Tareas • A) Añadir productos al carrito • B) Configurar la gestión de Sesiones • C) Confeccionar el carrito • D) Gestionar errores
  • 33. It3 A) Añadir productos al carrito Queremos poder añadir cada producto del catálogo al carrito. Podemos usar el built-in helper button_to(value,args), similar a link_to <%= button_to "Add to Cart", :action => :add_to_cart, :id => product %> Los helpers built-in que pueden ser usados en las vistas están definidos en las clases ActionView::Helpers::*Helper
  • 34. It 3. Gestión de sesiones • HTTP es stateless, pero se usan mecanismos. Para simular estados se usan mecanismos como URL rewriting, hidden input fields y cookies. • Rails usa cookies para identificar diferentes peticiones asociadas a la misma sesión de navegación. • El objeto session nos abstrae de este mecanismo (se comporta como un hash). • Por defecto session persiste en disco. Pero hay otros mecanismos: persistencia en memoria, en base de datos, DRb...
  • 35. It 3 B). Configurar la gestión de sesiones Usaremos persistencia de sesiones en base de datos. Rails ofrece una tarea rake para esto. ~/skateshop$ rake db:sessions:create && rake db:migrate Además tendremos que indicar en config/environment.rb que queremos usar este tipo de persistencia, ya que el tipo por omisión es en ficheros de texto en disco. config.action_controller.session_store = :active_record_store Los cambios en otros directorios distintos de app y public requieren reiniciar el servidor. Reiniciamos
  • 36. It3 C) Confeccionar el carrito Necesitamos definir una acción en el controlador para obtener el carrito de sesión y añadirle productos. class StoreController < ApplicationController def index @products=Product.find_sorted_by_title end def add_to_cart @cart=find_cart @cart.add_product Product.find(params[:id]) end def empty_cart session[:cart]=nil flash[:notice]="Your car is empty" redirect_to :action => :index end private def find_cart session[:cart] ||= Cart.new end end
  • 37. It3 C) Confeccionar el carrito Y definir la propia clase carrito, que es un almacén de productos. class Cart class CartItem attr_reader :product, :quantity attr_reader :items def initialize(product) def initialize @product=product @items=[] @quantity=1 end end def add_product(product) def title item = items.find { |item| item.title==product.title } product.title if item end item.increment_quantity else def price @items << CartItem.new(product) product.price * quantity end end end def increment_quantity def total_price @quantity+=1 @items.sum{ |item| item.price } end end end end
  • 38. It3 C) Confeccionar el carrito Además habrá que definir una vista que nos muestre el carrito. <div class="cart-title">Your Cart</div> <table> <% for item in @cart.items %> <tr> <td><%= item.quantity %>&times;</td> <td><%=h item.title %></td> <td class="item-price"><%= en_euros(item.price) %></td> </tr> <% end %> <tr class="total-line"> <td colspan="2">Total</td> <td class="total-cell"><%= en_euros(@cart.total_price) %></td> </tr> </table> <%= button_to "Empty cart", :action => :empty_cart %>
  • 39. It3 D) Gestionar Errores Echemos un vistazo a los últimos mapeos de routes.rb map.connect ':controller/:action/:id' Automáticamente lo que va después de la acción se mapea al parámetro id. http://localhost:3000/store/add_to_cart/fake Couldn't find Product with ID=fake def add_to_cart @cart=find_cart begin @cart.add_product Product.find(params[:id]) rescue ActiveRecord::RecordNotFound => e logger.error("Se intentó acceder al producto con id=#{params[:id]}") flash[:notice]="Oooops, we could't process your request" redirect_to :action=>:index end end
  • 40. It4. Una pizca de AJAX • En esta iteración aprenderemos a usar renderizado parcial de vistas, a actualizar dinámicamente la página con AJAX, y a manipuilar el DOM. • Tareas: • A) Refactorizar el carrito • B) Carrito basado en AJAX • C) Resaltar los cambios • D) Ocultar el carrito cuando está vacío • E) Hacer que el carrito funcione cuando Javascript está deshabilitado
  • 41. It5. Gestionar la compra • En esta iteración aprenderemos a conectar tablas del modelo con claves ajenas. Usar las relaciones belongs_to y has_many. A crear formularios basados en modelos y a conectar dichos furmularios, con los modelos y las vistas. • Tareas: • A) Caputurar una orden de compra
  • 42. It6. Gestionar los usuarios • En esta iteración aprenderemos a añadir autenticación a una sesión de usuario, a usar transacciones y crear un hook que añade nueva funcionalidad a ActiveRecord • Tareas: • A) Añadir Usuarios • B) Autenticación • C) Controlar el acceso
  • 43. Posibles prácticas • Notable • Crear una pequeña aplicación de gestión básica. • Añadir funcionalidad de subscripción y envío de newsletters a la aplicación existente (http://guides.rubyonrails.org/action_mailer_basics.html) • Añadir cualquier funcionalidad no trivial a la aplicación mediante plugins: (eg. paginación y búsqueda en vistas de listados) • Sobresaliente • Instalar los frameworks de pruebas BDD Rspec y Cucumber y diseñar e implementar un caso de uso dirigido por la prueba. • Crear un plugin de rails (http://guides.rubyonrails.org/plugins.html)
  • 44. Referencias • http://guides.rubyonrails.org/ • http://railsapi.com/doc/rails-v2.3.5/ • http://www.erikveen.dds.nl/distributingrubyapplications/rails.html • Agile Web Development with Rails, Third Edition (The Pragmatic Bookshelf) • The Rails Way (Addison-Wesley Professional) • Deploying Rails Applications: A Step-By-Step Guide (The Pragmatic Bookshelf) • Rails Cookbook (O`reilly) • Behaviour driven development with RSpec, Cucumber and Friends (The Pragmatic Bookshelf)

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. DRY Las responsabilidades se definen en un sitio, en el resto de la aplicaci&amp;#xF3;n se generan autom&amp;#xE1;ticamente mediante metaprogramaci&amp;#xF3;n. Esto permite que si hay un cambio en el lugar donde se define dicha responsabilidad, los dem&amp;#xE1;s lugares permanecer&amp;#xE1;n sincronizados.\n\nConvention Over Configuration es otro principio que guarda relaci&amp;#xF3;n con lo anterior. Imaginemos dos subsistemas dentro de nuestra aplicaci&amp;#xF3;n, por ejemplo la capa de modelo donde se definen las entidades y la capa de persistencia. Cuando nuestro modelo tenga que ser recuperado de la base de datos, se sabr&amp;#xE1; qu&amp;#xE9; columnas de qu&amp;#xE9; tabla contienen los valores de los atributos que hay que cargar en el modelo. &amp;#xC9;sto se debe a que se sigue una convenci&amp;#xF3;n de nombrado. Por ejemplo, si tenemos una entidad persona en el modelo, El sistema lo almacenar&amp;#xE1; por omisi&amp;#xF3;n en una tabla PERSONAS en la base de datos. Si la convenci&amp;#xF3;n no nos gusta, lo cambiaremos mediante configuraci&amp;#xF3;n, por ejemplo indicando en qu&amp;#xE9; tabla de la base de datos queremos almacenar las entidades Persona. Esto nos permite un mayor grado de integraci&amp;#xF3;n con sistemas legacy.\n
  5. A diferencia de Struts, se define un controlador para la interacci&amp;#xF3;n con cada modelo.\n
  6. \n
  7. A diferencia de Struts, se define un controlador para la interacci&amp;#xF3;n con cada modelo.\n
  8. Crear una aplicaci&amp;#xF3;n de rails, y ver la estructura de directorios.\n
  9. estructura de directorios: comentar.\n
  10. &amp;#xBF;Qu&amp;#xE9; acabamos de crear? Acabamos de crear un proyecto rails. Todos los proyectos rails tienen una estructura similar, necesaria para ser reconocida como aplicaci&amp;#xF3;n y que &amp;#xE9;sta funcione correctamente.\nPor el momento nos interesan los directorios app y script, aunque iremos viendo todos mas adelante.\nApp contiene la mayor parte del c&amp;#xF3;digo de nuestra aplicaci&amp;#xF3;n (salvo los recursos est&amp;#xE1;ticos tales como css que ir&amp;#xE1;n en public) y script contiene una serie de escripts escritos en ruby, que nos permitir&amp;#xE1;n generar componentes de la aplicaici&amp;#xF3;n, arrancar servidores de pruebas, instalar scripts, etc.\n
  11. &amp;#xBF;Qu&amp;#xE9; acabamos de crear? Acabamos de crear un proyecto rails. Todos los proyectos rails tienen una estructura similar, necesaria para ser reconocida como aplicaci&amp;#xF3;n y que &amp;#xE9;sta funcione correctamente.\nPor el momento nos interesan los directorios app y script, aunque iremos viendo todos mas adelante.\nApp contiene la mayor parte del c&amp;#xF3;digo de nuestra aplicaci&amp;#xF3;n (salvo los recursos est&amp;#xE1;ticos tales como css que ir&amp;#xE1;n en public) y script contiene una serie de escripts escritos en ruby, que nos permitir&amp;#xE1;n generar componentes de la aplicaici&amp;#xF3;n, arrancar servidores de pruebas, instalar scripts, etc.\n
  12. &amp;#xBF;Qu&amp;#xE9; acabamos de crear? Acabamos de crear un proyecto rails. Todos los proyectos rails tienen una estructura similar, necesaria para ser reconocida como aplicaci&amp;#xF3;n y que &amp;#xE9;sta funcione correctamente.\nPor el momento nos interesan los directorios app y script, aunque iremos viendo todos mas adelante.\nApp contiene la mayor parte del c&amp;#xF3;digo de nuestra aplicaci&amp;#xF3;n (salvo los recursos est&amp;#xE1;ticos tales como css que ir&amp;#xE1;n en public) y script contiene una serie de escripts escritos en ruby, que nos permitir&amp;#xE1;n generar componentes de la aplicaici&amp;#xF3;n, arrancar servidores de pruebas, instalar scripts, etc.\n
  13. &amp;#xBF;Qu&amp;#xE9; acabamos de crear? Acabamos de crear un proyecto rails. Todos los proyectos rails tienen una estructura similar, necesaria para ser reconocida como aplicaci&amp;#xF3;n y que &amp;#xE9;sta funcione correctamente.\nPor el momento nos interesan los directorios app y script, aunque iremos viendo todos mas adelante.\nApp contiene la mayor parte del c&amp;#xF3;digo de nuestra aplicaci&amp;#xF3;n (salvo los recursos est&amp;#xE1;ticos tales como css que ir&amp;#xE1;n en public) y script contiene una serie de escripts escritos en ruby, que nos permitir&amp;#xE1;n generar componentes de la aplicaici&amp;#xF3;n, arrancar servidores de pruebas, instalar scripts, etc.\n
  14. \n
  15. Comentar como es el control flow:\nCuando se invoca una url llega al componente de enrutado que se configura a trav&amp;#xE9;s del fichero config/routes.rb. &amp;#xC9;ste determina que controlador tiene que despachar la petici&amp;#xF3;n y dentro de &amp;#xE9;l qu&amp;#xE9; m&amp;#xE9;todo. Los m&amp;#xE9;todos de un controlador se llaman acciones. En una acci&amp;#xF3;n, se procesa un conjunto de datos (el modelo) y tras su finalizaci&amp;#xF3;n se redirige a una vista donde se presentar&amp;#xE1;n esos datos bien en HTML, en XML o en cualquier otro formato.\n\n[Ver el c&amp;#xF3;digo del controlador, ver que hereda de application controller, que es el controlador base de todos los controladores de la aplicaci&amp;#xF3;n y ver su c&amp;#xF3;digo.]\n\nCreamos una acci&amp;#xF3;n hola en el controlador, e invoqu&amp;#xE9;mosla.\n
  16. Por omisi&amp;#xF3;n, rails usa la siguiente convenci&amp;#xF3;n a la hora de invocar acciones de los controladores. Lo siguiente que va despu&amp;#xE9;s del dominio y path de la aplicaci&amp;#xF3;n (en nuestro caso es el raiz) es el nombre del controlador. y separado por una barra, el identificador de la acci&amp;#xF3;n.\n\nAl invocar la acci&amp;#xF3;n, vemos que nos aparece un error porque no se encuentra la vista por omisi&amp;#xF3;n.\n\nCreamos la vista.\n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. Ense&amp;#xF1;ar la migraci&amp;#xF3;n: Clases que crean la estructura de la base de datos (y en caso necesario los propios datos) y que permiten desarrollar de forma incremental la aplicaci&amp;#xF3;n. Cuando se ejecuta una migraci&amp;#xF3;n, estas tienen un timestamp y se aplican en cascada. se puede hacer un rollback volviendo a un estado anterior, cuando esto ocurre, se ejecuta el m&amp;#xE9;todo down.\n\nCada vez que se crea una migraci&amp;#xF3;n hay que ejecutar rake db:migrate. Y explicar que es rake y los rakefiles.\n\nAnatom&amp;#xED;a del controlador. Las acciones y los respond, ver c&amp;#xF3;mo se relaciona eso con routes.rb, que a&amp;#xF1;adi&amp;#xF3; un map.resources :products indicando que la entidad producto es un recurso REST y que por tanto las acciones siguen ese modelo de arquitectura.\n\nEnse&amp;#xF1;ar las vistas y ver como heredan del layout con el mismo nombre, o de application.html.rb si no existe &amp;#xE9;ste.\n\nVer la jerarqu&amp;#xED;a de tests.\n
  25. \n
  26. \n
  27. \n
  28. Explicar el helper cycle, y el helper truncate.\nExplicar que dentro de truncate quitan los tags con el gsub.\nExplicar como funciona link_to y las URLs REST.\nExplicar que el link_to de show y el link_to de Destroy apuntan a la misma url, determinada por product, pero que en destroy, al pasar :method, estamos siendo REST compliant y se dirige a una acci&amp;#xF3;n distinta dentro del controlador.\n
  29. \n
  30. \n
  31. \n
  32. Comentar la herencia de layout. application.html.rb\ny store.index.html.rb\ncomentar como funciona yield y content_for\n\n
  33. \n
  34. Comprobamos al clicar que no existe la acci&amp;#xF3;n add_to_cart definida en el controlador.\n\nAntes de crear el carrito, veamos c&amp;#xF3;mo mantener el estado en nuestra aplicaci&amp;#xF3;n.\n
  35. Comentar que el objeto session es persistente, ya que si residiese en memoria, con una carga de usuarios elevada, podr&amp;#xED;a mermar el rendimiento de la aplicaci&amp;#xF3;n incluso denegar el servicio.\n\nSi la carga de usuarios crece, y tenemos que escalar horizontalmente (es decir, meter m&amp;#xE1;s m&amp;#xE1;quinas) nada garantizar&amp;#xED;a que diferentes peticiones del mismo usuario lleguen a la misma m&amp;#xE1;quina, y se poducir&amp;#xED;an inconsistencias (ejemplo de la compra) es por ello que conviene usar persistencia de sesi&amp;#xF3;n distribuida. Por ejemplo en base de datos.\n\n[Comentar que DRB es un protocolo para compartir objetos entre procesos ruby]\n\n
  36. Si observamos el c&amp;#xF3;digo de la migraci&amp;#xF3;n veremos que lo que se persiste es el identificador de sesi&amp;#xF3;n y los datos de la sesi&amp;#xF3;n como texto. Esto es porque el contenido de la sesi&amp;#xF3;n es serializado a YML, que es un formato textual (el equivalente a JSON de ruby) por tanto s&amp;#xF3;lo se podr&amp;#xE1; guardar en sesi&amp;#xF3;n datos que sean serializables. (Un objeto file, por ejemplo, no lo es).\n
  37. \n
  38. \n
  39. Ense&amp;#xF1;ar c&amp;#xF3;mo se har&amp;#xED;a con partials\n\n&lt;%= render(:partial =&gt; &quot;cart_item&quot;, :collection =&gt; @cart.items) %&gt;\n\n&lt;tr&gt; &lt;td&gt;&lt;%= cart_item.quantity %&gt;&amp;times;&lt;/td&gt; &lt;td&gt;&lt;%=h cart_item.title %&gt;&lt;/td&gt; &lt;td class=&quot;item-price&quot;&gt;&lt;%= number_to_currency(cart_item.price) %&gt;&lt;/td&gt;\n&lt;/tr&gt;\n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n