miércoles, 2 de enero de 2008

Despedida del Curso

Hola a todos,

espero que no os hayais olvidado de este blog y que al menos dejeis algun comentario para no perder el contacto, pues sinceramente hemos tenido un buen rollo entre nosotros y eso deberiamos de intentar mantenerlo.

Yo propongo otra cena-pincheo para reunirnos y que vallamos todos, aun si ocurren adversidades con los autobuses ;) .

Saludos a todos, feliz año nuevo !

sábado, 22 de diciembre de 2007

FELIZ NAVIDAD

Feliz Navidad a todos desde el curso RoR
******************************************************

Nos vemos el miercoles. Que Papa Noel se porte bien con tod@s

;)

miércoles, 12 de diciembre de 2007

Active Record

Introducción :

Active Record es la capa que proporciona rails para implementar el patron ORM. La implementación de Active Record se caracteriza, como casi todo en rails, en la convención,

Por ejemplo, si tenemos un modelo 'Ciudad', existe una tabla en base de datos cuyo nombre es la pluralización del nombre del modelo 'ciudades'.


Definición del Patrón ORM :

“Un objeto que reprensenta una fila de una tabla o vista de base de datos, encapsula el acceso a la base y añade lógica del dominio sobre esos datos.”

Para implementar el patrón se deben seguir ciertos pasos:
  1. Las tablas se representan mediante clases
  2. Un objeto representa una fila de la tabla
  3. Un atributo del objeto representa una columna
  4. La clase debe tener métodos para insertar, actualizar y borrar una fila desde un objeto o bien crear un objeto a partir de una fila.


Migraciones:

  1. Las migraciones cambian el estado del esquema de la base de datos.
  2. Con ellas podemos crear o borrar tablas, añadir columnas o eliminarlas, renombrar el tipo de una columna... La consulta sql necesaria para ejecutar la operación la genera ActiveRecord por nosotros.
  3. Esto se consigue construyendo una clase que herede de ActiveRecord::Migration.
  4. Básicamente se necesita implementar 2 métodos de clase: up y down
  5. El méto up se ejecuta cuando estamos migrando 'hacia adelante' y el down cuando migramos 'hacia atrás'

Tipos de migraciones de modificación de tablas y columnas:

  1. Operaciones con tablas: create_table , remove_table , rename_table
  2. Operaciones con columnas: add_column, remove_column , rename_column, etc
  3. Opciones : :null =>true or false , :limit => tamaño , :default => value

Rails asume por defecto que todas las tablas tienen una clave primaria numérica llamada por convención id.


Crear y buscar registros (ejemplo):

def crear_ciudad

ciudad = Ciudad.new

ciudad.nombre = 'Gijón'

ciudad.habitantes = 300000

ciudad.provincia = 'Asturias'

ciudad.save

end

#Se creará el registro en la base de datos, con id = 1

def busca_ciudad_por_id

gijon = Ciudad.find(1)‏

end



Más opciones del find:

:order -> Permite especificar el campo por el que se ordenarán los resultados

:limit -> Indicar el máximo número de registros que devolverá la consulta

:joins -> Para construir la consulta con inner joins

:select -> Especifica los campos que se van a incluir en la consulta. Por defecto *

:from, :group, :having, :distinct, :lock ...


Ejemplo :

def busqueda_con_opciones

ciudades = Ciudad.find :all, :select => 'nombre', :from => 'ciuadades', :limit => 10, :order => 'habitantes desc',

end


Actualizar y guardar registros :

Para actualizar una fila de la bbdd, podemos usar los métodos save, update, update_attribute, o update_attributes.

def ejemplo_save

ciudad = Ciudad.find :first

ciudad.habitantes += 1000

ciudad.save

end


def ejemplo_update_attributes

ciudad = ciudad.find :first

ciudad.update_attributes :nombre => 'otro nombre', :habitantes => 500, :provincia => 'León'

end


Borrar registros:

Para actualizar una fila de la bbdd, se nos ofrecen los métodos delete, destroy. Se les pueden pasar condiones si terminan en _all

def ejemplo_destroy

ciudad = Ciudad.find :first

ciudad.destroy

end


def ejemplo_destroy_all

ciudad.find :first

limite_habitantes = 100

ciudad.destroy_all([habitantes < ?,limite_habitantes])‏

end


Curiosidades:
  • Diferencia entre find y find_by_id:

La diferencia básica es que el find lanza una excepción (que deberíamos capturar) si no encuentra el registro, mientras que find_by_id (o cualquier buscador dinámico) devuelve nil o [] si no encuentra nada.

  • Diferencias entre Save, save!, create,create!, update_attributes y update_attributes! :

Las que no terminan con ! devuelven true o false, segun se haya guardado correctamente en base de datos o no. Es tarea del programador ocuparse (o no) de lo que pasa con la base de datos.
Las que terminan en ! lanzan una excepción si no se guarda correctamente en la base de datos. Esto es ideal para las traasacciones.

Scaffolding

El Scaffolding sirve para crear automáticamente el código necesario para tener una primera versión de la aplicación.
Lo primero de todo se creará un nuevo rails project, generandose la estructura de directorios.
Lo siguiente que tenemos que hacer es ir al generador (en la parte inferior) y seleccionar en el menú desplegable la opción 'model'.
Esto creará en app/models el fichero "ejemplo.rb", el cual contendrá la deficinión de la clase y en db/migrate el archivo 001_create_ejemplos.rb.
Luego debemos crear el esquema en la base de datos.El nombre del esquema debe coincidir con el nombre que le hayamos puesto a nuestro proyecto. Al trabajar en entorno de desarrollo, le añadiremos al final '_development'.
Después de tener el esquema,vamos al fichero 001_create_ejemplos.rb y escribimos la columnas que que queramos que tenga nuestra tabla:

class CreateEjemplos < ActiveRecord::Migration
def self.up
create_table :ejemplos do |t|

t.column :title, :string
t.column :description, :text
t.column :image_url, :string

end
end

def self.down
drop_table :ejemplos
end
end

A continuación migramos la base de datos, vamos a la pestaña 'Rake tasks' que se encuentra en la parte inferior y seleccionamos en el desplegable la opción 'migrate'.
Se nos creara las tablas en nuestra base de datos.
Para generar el escaffold, solo nos queda pedirle al generador que lo haga por nosotros. Para ello vamos a la pestaña de 'generators' y escogemos la opción scaffold, pasándole como parámetro el nombre del modelo del que queremos generar la estructura.
Si todo va bien, crea las vistas y operaciones de las operaciones básicas de cualquier objeto de negocio (crear, editar, listar y borrar), de forma automática.

Introducción a Rails

Rails es un framework de código abierto para Ruby que sirve para desarrollar aplicaciones web que acceden a bases de datos, basado en el paradigma Modelo-Vista-Controlador (MVC).
El patrón MVC no está directamente relacionado con las aplicaciones web o Ruby on Rails. Tiene su origen en el lenguaje Smalltalk que no tiene nada que ver con la web.
El patrón MVC tiene tres componentes clave:

  • Modelo: Responsable de la lógica de negocio y de mantener el estado de la aplicación.

  • Vista: Es la responsable de generar el interfaz de usuario, normalmente basado en datos del modelo.

  • Controlador: Responsable de controlar el flujo y estado de la entrada de datos por parte del usuario. Reciben eventos del usuario, interactúa con el modelo y muestra la vista correspondiente al usuario.

Ruby on Rails está basado en dos principios fundamentales:

  • No te repitas: La idea es tener algún mecanismo para evitar tener que repetir código que es necesario desde distintos puntos de la aplicación.

  • Convención sobre configuración: Lo que se pretende es evitar tener que usar ficheros de configuración.

Puntos fuertes de rails:

  • Metaprogramación: La metaprogramación consiste en escribir programas que escriben otros programas.

  • ActiveRecord: Consigue es mapear las tablas de la base de datos con nuestros objetos de negocio utilizando metaprogramación.

  • Scaffolding: Esta técnica permite crear automáticamente el código necesario para tener una primera versión de la aplicación, en concreto, crea las vistas y operaciones de las operaciones básicas de cualquier objeto de negocio (crear, editar, listar y borrar).

Comprobación integrada: Rails integra todos los elementos necesarios para desarrollar test sobre la aplicación.

Tres entornos: Rails ofrece tres entornos predeterminados: desarrollo, producción y test. Cada uno tiene un comportamiento ligeramente distinto, por ejemplo Rails crea una copia vacía de la base de datos de test para cada prueba realizada.

AJAX: Rails ofrece integración con AJAX, con esto se consiguen unas interfaces de usuario más vistosas e interactivas para el usuario.

Tema 12. hpricot

-Es un parser de HTML sencillo de usar y a la vez muy
potente.
Nos permite extraer información de páginas HTML.

Básicamente es una libreria la cual permite pasar código HTML a un objeto.

En nuestra clase necesitamos implementar :

require 'open­uri'
require 'hpricot'

  • open­uri: Nos permite abrir una url, por ejemplo una pagina html.
  • hpricot; Nos permite utilizar la librería Hpricot Hpricot Basics.

Cargar una pagina HTML:

Se puede cargar de un String:

 doc = Hpricot("<p>A simple <b>test</b> string.</p>")



Se puede cargar de un Fichero:
  • doc = open("index.html") { |f| Hpricot(f) }
Se puede cargar de una url:
  • require 'open­uri'
  • doc = Hpricot(open("http://qwantz.com/"))
Buscar Elementos:

Se pueden usar expresiones XPath o CSS.

Expresiones CSS

Doc.search realiza una búsqueda recibiendo como
parámetro la expresión, nos devolverá un array.
doc.search (“p.posted”)
doc / “p.posted” ­­> “ / ” Alias del metodo search
En ambos casos se devolverán todos los elementos
p con la clase “posted”.
< class =" “posted”">

Selectores CSShttp://www.w3.org/TR/CSS21/selector.html (punto 5.1)

Encadenar Búsquedas

require 'rubygems'
require 'open­uri'
require 'hpricot'
men = open("http://www.marca.es")
doc = Hpricot(men)
noticia = doc / ".noticiaPrincipal"
enlace = noticia / "a"
puts "Elementos <a> dentro de la
clase noticiaPrincipal"
enlace.each{|e|
puts e.inner_html
}


Obtener Elementos

inner_html: Este método nos devuelve el html
interno del elemento.
get_attibute(“atributo”): Este método nos devuelve
un atributo de un elemento. (También se puede
acceder con [] )
enlace.each{|t|
puts t['href']
puts t.get_attribute('href')
}


Nota: para añadir codigo HTML y que no sea interpretado:
http://blogcrowds.com/resources/parse_html.php

miércoles, 28 de noviembre de 2007

El foro de Ruby on Rails

Hola a todos,

pues a partir de ahora ya tenemos un foro donde encontrarnos y discutir temas sobre Ruby y resolver dudas entre todos.

http://www.foros.net/index2.php?mforum=fororuby


Saludos