REST in Rails: Ejemplo del Blog y los Post

13 Junio, 2008 por xurdeendicampus

Como esto del REST se complico un poco voy a subir un mini HOWTO de lo que yo entendi que hay que hacer basandonos en el ejemplo de que un Blog tiene varios posts.

- Empezamos tocando el config/routes.rb :

Comentamos map.resources :posts <– Para que no se pueda acceder por las url “clasicas” de post
Editamos map.resources :blogs, :has_many => :posts <– Para que se pueda acceder por las url tipo REST de post a traves de Blog

- Ahora vamos al controlador de posts :

– En todos los metodos del controlador buscamos el blog: @blog = Blog.find(params[:blog_id]) <– Necesitamos el blog en todas las acciones de post puesto que luego lo vamos a usar en las vistas.
Editamos los redirect to @post por redirect_to(blog_posts_path(@blog)) <– no queremos redirigir a mostrar los posts, sino a los posts del blog

- Cambiamos los formularios de edicion y creacion:

– Pasaran a ser: form_for ([@blog, @post]) do |f|

– Por ultimo editamos las vistas para cambiar los links que hagan referencia a los posts:

– Los links ATRAS(listar) son : link_to “Atras”, blog_posts_path(@blog)
– Los links a EDITAR son: link_to “Editar”, [:edit, @blog,@post]
– Los links a MOSTRAR son: link_to “Mostrar”, [@blog,post] <— ojo, post sin @ cuando lo tenemos dentro de un bucle… (ej el index que genera el scaffold), en el edit del scaffold seria con @

– Los links a NUEVO son: link_to “Nuevo”, new_blog_post_path(@blog)

– Los links a Borrar son: link_to ‘Borrar’, [@blog,post], :confirm => ‘Are you sure?’, :method => :delete

Es una guia rapida y chapucera, pero para orientarnos un poco valdra no?

Comandos desde consola

4 Junio, 2008 por raulcaster

Existen unos comandos muy empleados, para la creación y gestión de proyectos Rails. Antes de ejecutarlos, debemos situar el prompt en el directorio del proyecto.

  • Arrancar el servidor: NO se debe utilizar nunca el servidor de Aptana, sino que se debe arrancar desde la consola: ruby script/server -p nPuerto. La parte de especificación del puerto es opcional. Si se omite, se tomará el puerto 3000.
  • Generar un controlador: ruby script/generate controller nombre_controlador accion1 accion2 … accionN. Las acciones son los métodos que contendrá el controlador, aunque se pueden omitir. En este caso, se creará un controlador vacío.
  • Generar un archivo de migración: ruby script/generate migration nombre. No hay que incluir el número de orden de la migración, pues el sistema se encarga de ello.
  • Ejecutar migración: rake db:migrate -VERSION=versión. Para ejecutar una migración concreta. Si no se especifica la versión, ejecutará la última migración.

Estructura de un proyecto Rails

4 Junio, 2008 por raulcaster

La característica más destacable de un proyecto Rails es la división física de los archivos, para fortalecer la división de sus funciones siguiendo el patrón Modelo-Vista-Controlador. Veamos los directorios más empleados de los que componen esta estructura.

app

Esta carpeta contiene los archivos que forman el sitio, repartidos según sus características en los subdirectorios controllers, helpers, models y views.

  • Models: la función principal de los modelos es la obtención de datos, almacenados en una base de datos, un fichero, etc., y de controlar la integridad de estos datos.
  • Views: en una página web, las vistas son las distintas interfaces del usuario. A su vez, contiene una carpeta denominada Layout. Aquí, están unos ficheros que incluyen, básicamente, el apartado head de un archivo html. Después, por medio de bloques Ruby, se añade el cuerpo de las vistas para conformar el fichero completo.
  • Controllers guarda los archivos correspondientes a los controladores del sistema. Su trabajo consiste en recibir eventos del usuario (envío de formulario, pulsación de un enlace), invocar al modelo para recuperar los datos que necesita, y trasladarlos a la vista, para que los muestre.

Cuando se definen las acciones de un controlador, se debe crear una vista para cada una de estas acciones. Cuando se invocan estos métodos, tras su ejecución, se muestra automáticamente la vista correspondiente al método ejecutado. A su vez, si es necesario, se puede crear un modelo para el controlador.

config

En esta carpeta, se almacenan los archivos de configuración del proyecto. Los archivos que nosotros solemos modificar son routes.rb y database.yml. En el primero, es posible modificar el controlador y su acción que se ejecutarán al acceder al sitio. En el otro, podemos modificar el nombre de la base de datos asociada al proyecto.

db

Principalmente, esta carpeta incluye las migraciones, es decir, los archivos de creacion y edición de la base de datos relacionada con el proyecto.

doc

Aquí se almacena la documentación del proyecto.

log

Los archivos guardados en este directorio son registros de la ejecución del sitio.

public

Este directorio tiene las imágenes que se muestran en las distintas vistas del proyecto, así como las hojas de estilo empleadas.

Instalacion de Rails en Ubuntu

4 Junio, 2008 por xurdeendicampus

Como vamos a empezar con Rails sin tenerlo instalado?

Pues eso, que vamos a empezar por el principio con una forma buena bonita y barata de instalar Ruby on Rails en Ubuntu 8.04.

Vamos por pasos:

  1. Instalar Build-Essential : sudo apt-get install build-essential
  2. Instalamos los paquetes necesarios para que rails funcione: sudo apt-get install ruby ri rdoc mysql-server libmysql-ruby ruby1.8-dev irb1.8 libdbd-mysql-perl libdbi-perl libmysql-ruby1.8 libmysqlclient15off libnet-daemon-perl libplrpc-perl libreadline-ruby1.8 libruby1.8 mysql-client-5.0 mysql-common mysql-server-5.0 rdoc1.8 ri1.8 ruby1.8 libopenssl-ruby1.8
  3. Descargamos, descomprimimos y configuramos Rails: sudo wget http://rubyforge.org/frs/download.php/20989/rubygems-0.9.4.tgz
    tar xvzf rubygems-0.9.4.tgz
    cd rubygems-0.9.4
    sudo ruby setup.rb
  4. Instalamos Rails: sudo gem install rails –include-dependencies (con dos guiones “- -” include) IMPORTANTE: este paso puede dar un error del tipo could not find rails >0. Simplemente volvemos a ejecutar la orden y ya deberia funcionar.
  5. Y un par de herramientas para la gestion de las bases de datos MySQL: sudo apt-get install mysql-query-browser
    sudo apt-get install mysql-admin
  6. Por ultimo y opcionalmente abrimos Aptana, esperamos e instalamos las gemas(gems) que nos sugiera.

Tras este articulo le devuelvo la conexion a nuestros estudios centrales, donde mis compañeros os enseñaran a trabajar con Rails.

P.D.: Inestimable la colaboracion de Victor para este post.

Resumen de Comandos

4 Junio, 2008 por xurdedicampus

HTML TAGS

Redirige a una WEB
link_to (TEXTO, opciones = {}, HASH_atributos_HTML_CSS = nil)
:confirm => “TEXTO pregunta”
:popup => true || array of window options
# link_to “View Image”, { :action => “view” }, :popup => ['new_window_name', 'height=300,width=600']
:method => symbol of HTTP verb

Insertar IMAGENES
image_tag(“icon.png”, :size => “16×10″, :alt => “ALT”)

Redirige a una Accion
redirect_to(:controller => ‘controlador’, :action => ‘accion’)

Leer el resto de esta entrada »

Patrón Modelo-Vista-Controlador

4 Junio, 2008 por rormiguel

Descripción

Para el diseño de aplicaciones con sofisticados interfaces se utiliza el patrón de diseño Modelo-Vista-Controlador. La lógica de un interfaz de usuario cambia con más frecuencia que los almacenes de datos y la lógica de negocio. Si realizamos un diseño ofuscado, es decir, un pastiche que mezcle los componentes de interfaz y de negocio, entonces la consecuencia será que, cuando necesitemos cambiar el interfaz, tendremos que modificar trabajosamente los componentes de negocio. Mayor trabajo y más riesgo de error.

Se trata de realizar un diseño que desacople la vista del modelo, con la finalidad de mejorar la reusabilidad. De esta forma las modificaciones en las vistas impactan en menor medida en la lógica de negocio o de datos.

Elementos del patrón:

  • Modelo: datos y reglas de negocio
  • Vista: muestra la información del modelo al usuario
  • Controlador: gestiona las entradas del usuario

Un modelo puede tener diversas vistas, cada una con su correspondiente controlador. Un ejemplo clásico es el de la información de una base de datos, que se puede presentar de diversas formas: diagrama de tarta, de barras, tabular, etc. Veamos cada componente:

  1. El modelo es el responsable de:
    • Acceder a la capa de almacenamiento de datos. Lo ideal es que el modelo sea independiente del sistema de almacenamiento.
    • Define las reglas de negocio (la funcionalidad del sistema). Un ejemplo de regla puede ser: “Si la mercancía pedida no está en el almacén, consultar el tiempo de entrega estándar del proveedor”.
    • Lleva un registro de las vistas y controladores del sistema.
    • Si estamos ante un modelo activo, notificará a las vistas los cambios que en los datos pueda producir un agente externo (por ejemplo, un fichero bath que actualiza los datos, un temporizador que desencadena una inserción, etc).
  2. El controlador es responsable de:
    • Recibe los eventos de entrada (un clic, un cambio en un campo de texto, etc.).
    • Contiene reglas de gestión de eventos, del tipo “SI Evento Z, entonces Acción W”. Estas acciones pueden suponer peticiones al modelo o a las vistas. Una de estas peticiones a las vistas puede ser una llamada al método “Actualizar()”. Una petición al modelo puede ser “Obtener_tiempo_de_entrega( nueva_orden_de_venta )”.
  3. Las vistas son responsables de:
    • Recibir datos del modelo y los muestra al usuario.
    • Tienen un registro de su controlador asociado (normalmente porque además lo instancia).
    • Pueden dar el servicio de “Actualización()”, para que sea invocado por el controlador o por el modelo (cuando es un modelo activo que informa de los cambios en los datos producidos por otros agentes).

Un ejemplo de MVC con un modelo pasivo (aquel que no notifica cambios en los datos) es la navegación web, que responde a las entradas del usuario, pero no detecta los cambios en datos del servidor.

El diagrama de secuencia:

Pasos:

  1. El usuario introduce el evento.
  2. El Controlador recibe el evento y lo traduce en una petición al Modelo (aunque también puede llamar directamente a la vista).
  3. El modelo (si es necesario) llama a la vista para su actualización.
  4. Para cumplir con la actualización la Vista puede solicitar datos al Modelo.
  5. El Controlador recibe el control.

Bingo sobre Railes

22 Mayo, 2008 por xurdedicampus

ver tutorial anterior

En este tutorial Desarrollaremos un bingo para un solo usuario utilizando sessiones para guardar el progreso de la partida

Creamos la Aplicacion

rails bingo

Ahora metemos en en la carpeta \app\models las clase Bingo.rb y Carton.rb

Leer el resto de esta entrada »

Sintaxis básica de Ruby

21 Mayo, 2008 por raulcaster

Introducción.

Ruby es un lenguaje de script interpretado, orientado a objetos, rápido y sencillo. No obstante, no es la panacea del programador. Las características básicas del lenguaje son las siguientes:

  • Los comentarios comienzan por #.
  • Las sentencias no terminan en ;.
  • Se pueden evitar los paréntesis cuando no haya ambigüedad.
  • Las variables locales comienzan por minúscula.
  • Las constantes empiezan por mayúscula.

Los recursos que se emplearán serán el comando irb y la API de Ruby (http://www.ruby-doc.com/core/).

La clase Fixnum.

Son los números enteros del rango 2^-30 a 2^30. Si se sobrepasa el límite del rango tras una operación, el tipo de la variable pasa automáticamente a Bignum. Como todo en Ruby es un objeto, un número constante tiene métodos a los que se puede invocar. Algunos métodos destacados son to_s (entero a string), to_f (entero a float), divmod (devuelve un array con el resultado y el cociente de una división) y remainder (retorna el resto de una división).

La clase Float.

Representa los números reales, en coma flotante con doble precisión. Algunos de los métodos que presenta son to_s (float a string), to_i, to_int, truncate (float a entero, truncando la parte decimal) y round (redondear a entero más cercano).

Los boolenanos.

En Ruby no existe un tipo de dato booleano, explícitamente. No obstante, reconoce los valores false y nil. Todo lo demás es falso (incluido 0, a difierencia de otros lenguajes de programación).

La clase String.

Cadenas de texto, encerradas entre comillas simples o dobles. La diferencia entre usar unas u otras estriba en que con las dobles, se parsea el contenido la cadena (por ejemplo, \n se traduce como un salto de línea), mientras que con las simples, la cadena no se traduce. Es posible acceder a los caracteres de la cadena a través de su índice. Si éstos son negativos, se empieza a contar desde el final de la cadena. Los métodos más destacados son los siguientes:

  • capitalize: hace mayúscula la inicial de la cadena.
  • concat / <<: concatena una cadena a otra.
  • []: devuelve el código ascii del carácter que ocupa la posición indicada.
  • delete: borrar de la cadena el carácter indicado.
  • eql? / == / equal?: los tres comprueban si dos cadenas son iguales. Además, equal? compara también que se trate del mismo objeto.
  • to_i / to_f / to_sym: transformar una cadena en entero, float o símbolo (un símbolo es una variable que apunta a una posición que contiene una cadena igual al nombre del símbolo. Su ventaja es que símbolos con el mismo nombre hacen referencia a la misma cadena).
  • upcase / downcase / swapcase: transformar una cadena a mayúsculas, minúsculas o intercambiar mayúsculas y minúsculas, y viceversa.
  • reverse: invertir el orden de los caracteres de una cadena.
  • next: retorna el siguiente caracter de la cadena, según el orden alfabético.
  • chop: elimina el último carácter de una cadena.
  • chomp: eliminar el salto de línea final de una cadena.
  • strip / lstrip / rstrip: eliminar los espacios en blanco de una cadena por ambos lados, sólo la izquierda o sólo la derecha.
  • split: generar un array a partir de un string, indicando el patrón separador de componentes.

Rangos.

Para comprobar la inclusión de un valor en un rango, se emplea el operador ===. Los rangos pueden ser de dos tipos:

  • (a..b): es equivalente a [a,b].
  • (a…b): es equivalente a [a,b).

Algunos métodos son: begin, end (devuelven el extremo inferior y superior del rango), exclude_end (informa acerca de la exclusividad del extremo superior del rango), to_a (convertir un rango en un array).

Expresiones regulares.

Es un patrón que generalizar un conjunto de cadenas. Pertenecen a la clase Regexp. Para comprobar si una cadena cumple una expresión regular, se emplea el operador =~.

Símbolos.

Anteriormente, ya se ha explicado lo que es un símbolo. Para determinar si se debe emplear una cadena o un símbolo, hay que pensar sobre si lo importante es la identidad del objeto y el contenido del objeto. Algunos de los métodos que se pueden aplicar son to_i (símbolo a entero), to_f (símbolo a float) y to_s (símbolo a string).

Arrays y hashes.

Son colecciones de cualquier tipo de objetos (pueden ser distintos dentro de la misma colección). Los arrays son indexados mediante enteros, a diferencia de los hashes, que se indexan mediante cualquier objeto (que también pueden ser de distinto tipo). Por tanto, el array es más eficiente (está ordenado), mientras que el hash es más flexible. Los métodos más importantes son:

  • join: genera un string a partir de un array. Debemos indicar el patrón que separará las componentes en el array.
  • sort: ordena el array.
  • rsort: invierte el orden de los elementos del array.
  • length: proporciona la longitud del array.
  • flatten: desanida el array (transforma un array bidimensional o unidimensional).
  • uniq: elimina elementos duplicados.
  • include?: comprobar si un elemento pertenece a un array.

Los arrays se crean entre corchetes, mientras que los hashes, entre llaves, indicando clave y valor.

Estructuras del lenguaje.

if / elsif / else

if condicion1

sentecias

elsif condicion2

sentencias

else

sentencias

end

unless: similar al if, se verifica cuando la condición no se cumple. No existe elsunless.

unless condicion

sentencias

end

case: es el switch de otros lenguajes. En Ruby, el elemento estudiado puede ser de cualquier tipo. Permite estudiar la inclusión en un rango, la clase a que pertenece una variable o el cumplimiento de una expresión regular.

case a

when a = ..

sentencias

when a = ..

sentencias

else

sentencias

end

while: bucle más sencillo

while condicion

sentencias

end

until: funciona de forma similar al while, pero se ejecuta mientras no se verifica la condición:

until condicion

sentencias

end

Interrupción de los bucles:

  • break: sale del bucle.
  • next: pasa a la siguiente iteración del bucle.
  • redo: reinicia la iteración actual.
  • return: sale del bucle y del método que lo contiene.

Un pequeño ejemplo en Rails

15 Mayo, 2008 por xurdedicampus

Como hacer el ejercicio 1 de ruby en Rails => Programa que coge 2 números y los Suma, Resta, Multiplica o Divide

Desde el directorio de ruby

Rails calculadora #Creamos la Aplicación
cd calculadora
ruby script/generate controller calculadora # Creamos el Controlador

Leer el resto de esta entrada »

La navegación

14 Mayo, 2008 por xuan

La navegación en la web tiene como objetivo ayudar al usuario a encontrar lo que busca. Informa de:

  • La situación del usuario: dónde está.
  • Qué contiene la página que está visitando.
  • A dónde se puede ir desde la página en la que está situado.
  • Cómo usar la web que visita.

Convenciones sobre la navegación.

Describen una serie de elementos que deben estar presentes en una página para asegurarse de que su uso resulta
intuitivo al usuario.

Navegación persistente

Se refiere a los elementos comunes a todas las páginas de nuestra web que permiten navegar de unas a otras o realizar
acciones que no son dependientes del contenido específico de una página en particular.

  • Identificador del sitio: generalmente en la parte superior izquierda
  • Secciones: deben ser fácilmente localizables
  • Enlace a la página principal: debe estar siempre presente y ser fácilmente localizable
  • Utilidades: ofrecen la posibilidad de realizar acciones que no pertenecen a la jerarquía de información de la página.
  • Búsqueda:
    • Debe ser fácilmente identificable.
    • Simple: evitar instrucciones y opciones.
  • Nombre de la página: único para cada página, situado de forma que sea fácilmente localizable.
  • Migas de pan: situadas de forma localizable, pero discreta. Describen la situación del usuario en la jerarquía de la web.
  • Navegación local: depende del contexto de la página. Enlaza a contenidos de interés o relacionados con los de la página actual.