Lo que debemos hacer si queremos que un div tenga posicion absoluta con respecto a otro es lo siguiente, el primer div que creamos o sea el contenedor debe tener posicion relativa y el contenido debe tener posicion absoluta de esa manera conseguimos que el contenido tenga posicion absoluta con respecto al contenedor
jueves, 6 de noviembre de 2008
Position absolute and relative
Lo que voy a postear aqui es como hacer que un div tenga posicion absoluta con respecto a otro div, en lugar de tener posicion absoluta con respecto a el body
martes, 4 de noviembre de 2008
Como evitar validacion de token
Para las acciones ajax muchas veces no nos interesa que se haga la validación del token de autenticidad, por lo cual aqui les voy a mostrar como hacer para evitar la misma
skip_before_filter :verify_authenticity_token, :only => [:action]
en :action se debe poner la accion que se desea que no valide el token de autenticidad
viernes, 31 de octubre de 2008
Named Scope
Los named_scope nos sirven para definir consultas que vamos a utilizar muy a menudo, estos metodos se definen en el modelo y son estaticas o sea si definimos un named_scope llamado activos en el modelo User, lo vamos a acceder de la siguiente manera User.activos, lo que tiene de interesante los named_scope es que pueden recibir parametros, ahora vamos a ver algunos ejemplos para que sean mas faciles de entender
class User < ActiveRecord::Base
named_scope :active, :conditions => {:active => true}
named_scope :find_with_ids, lambda { |ids| {:conditions => ["id in (?)", ids] }}
end
El primer named_scope que definimos(active) nos permite buscar a todos los usuarios que este activos de la siguiente manera
User.active
El segundo named_scope es un poco mas complejo, lo que nos permite es buscar a todos los usuarios que tengan un id que este en la lista que le pasamos como parametro.
user_ids = [1,2,34, 56]
User.find_with_ids(user_ids)
Esto nos debuelve la lista de usuario cuyo id sea igual a alguno de los numeros que esta en el array.
jueves, 30 de octubre de 2008
Validar que un atributo sea numerico (validates_numericality_of)
Cuando deseamos validar que un atributo de nuestro modelo sea numerico, lo que podemos hacer es agregarle la siguiente linea al modelo, esta validación incluye opciones que nos permiten hacer que el atributo este en un rango determinado entre otras cosas:
validates_numericality_of :atributo_a_validar, :opciones
Cuando el atributo al que se le desea validar si es numerico no cumple con lo que se le especifica en las opciones el mismo es agregado a una lista de errores que tiene el objeto del modelo.
validates_numericality_of :atributo_a_validar, :opciones
Cuando el atributo al que se le desea validar si es numerico no cumple con lo que se le especifica en las opciones el mismo es agregado a una lista de errores que tiene el objeto del modelo.
:atributo_a_validar - es el atributo al cual deseamos validarle el largo
:opciones - las opciones deben ir separadas por comas
- :message => mensaje, nos permite cambiar el mensaje que está asociado por defecto a el error, el mensaje por defecto es el siguiente "is not a number".
- :on => nos define en que momento se va a hacer dicha validación por defecto es en el salvado del objeto, pero se puede especificar :create o :update.
- :only_integer => nos especifica que el objeto a validar solo puede ser un entero por defecto esta en false.
- :allow_nil => esquiva esta validación si el objeto es nil, esta opcion esta por defecto en false
- :greater_than => especifica que el valor del atributo debe ser mayor que el numero que le indiquemos.
- :greater_than_or_equal_to => especifica que el valor del atributo debe ser mayor o igual que el numero que le indiquemos.
- :equal_to => especifica que el valor del atributo debe ser igual que el valor que le indiquemos
- :less_than => especifica que el valor del atributo debe ser menor que el valor que le indiquemos
- :less_than_or_equal_to => especifica que el valor que le indiquemos debe ser menor o igual que el valor que le indiquemos
- :odd => indica que el atributo debe ser impar
- :even => nos indica que el atributo debe ser par
- :if => especifica un metodo, procedimiento o string que se utiliza para saber si realizar la validacion, este metodo debe retornar un valor booleano
- :unless => especifica un metodo, procedimiento o string que se utiliza para saber si no se debe realizar la validacion, este metodo debe retornar un valor booleano
Ejemplos:
Valida el atributo number del modelo cuando el mismo se actualiza
validates_numericality_of :number, :on => :update
Valida que el atributo number del modelo sea mayor que 10
validates_numericality_of :number, :greater_than => 10
Valida que el atributo number del modelo sea mayor o igual que 5 y menor que 10
validates_numericality_of :number, :greater_than_or_equal_to => 5, :less_than => 10
Valida que el atributo number del modelo sea igual a 2 si el atributo name es igual a "pepe"
validates_numericality_of :number, :equal_to => 2, :if => :name_validation
def name_validation
self.name == "pepe"
end
martes, 28 de octubre de 2008
Como evitar el doble submit
Un problema tipico de la programación web es el doble submit, esto ocurre cuando un usuario luego de ingresar la información en un form hace varios clicks en el input submit.
Una manera de evitar esto es mediante javascript, en nuestro caso que estamos utilizando rails lo podemos agregar en el application.js, pero se puede agregar en cualquier js que utilizemos en las paginas que estemos desarrollando.
Para agregar este ejemplo debemos agregar la libreria de prototype.js
var SubmitHelper = {
disableFormsOfPage: function(){
$$('form').each(function(form) {
form.observe('submit', function() {
form.getInputs('submit').each(function(submit) {
if (!submit.readAttribute("no_disabled")){
submit.value = "Trabajando...";
submit.disable();
}
});
});
});
},
init: function(){
Event.observe(window, 'load', SubmitHelper.disableFormsOfPage.bindAsEventListener())
}
}
SubmitHelper.init();
Bien ahora vamos a explicar un poco lo que hace el codigo lo que hacemos es recorrer todos los forms que hay en la pagina y para cada uno de ellos observamos el submit, una vez que ocurre dicho evento lo que hacemos es obtener el input que realizo el submit y a este le preguntamos si tiene el atributo no_disabled(este atributo es agregado por nosotros y lo que indica es que a este boton no hay que desabilitarlo) en caso de que no exista se le setea el valor "Trabajando...", el valor puede ser cualquiera o dejar el que ya tiene y luego lo deshabilitamos.
Suponiendo que estamos adentro de un form
<input type="submit" value="Crear">
En este caso si agregamos el javascript que escribimos mas arriba el boton se deshabilita al momento de hacer submit y escribe el texto "Trabajando..."
<input type="submit" value="Crear" no_disabled="true">
En este caso el boton no se deshabilita
Borrar elementos de un array
Para borrar todos los elementos de un array que cumplan con determinada condición ruby nos ofrese delete_if, este metodo se utiliza de la siguiente forma
[1,2, 10, 20].delete_if { |element| element > 10}
Esta operación nos eliminara del array todos los elementos mayores que 10 en este caso el 20, el resultado de este metodo es otro array con el resultado de la operacion en nuestro caso [1,2,10]
Otro ejemplo podria ser el siguiente
["a", "z", "d", "h"].delete_if { |element| element > "a"}
Esto nos retornaria un array cuyo unico elemento es la "a"
sábado, 25 de octubre de 2008
Que son y como hacerlas
Las migrations son archivos escritos en codigo ruby que nos definen nuestro esquema de base de datos cada una es una parte de la base, en las migrations puede haber tanto codigo para crear tablas o modificarlas, como ingreso de datos o cualquier otra cosa que necesitemos en nuestro esquema como por ejemplo un indice. Se debe tratar de que cada migration sea atómica es decir hay que tratar de no modificar o crear mas de una tabla por migration, esto se hace por el hecho de que si falla una parte de una migration hay que volverla para atras y si escribimos por ejemplo la creación de dos tablas, y tenemos un error en la segunda, la primera tabla ya se creo pero falló la migration por lo cual cuando tratemos de correr nuevamente la migration, está nos va a dar un error ya que la primera tabla ya existe, entonces debemos ir a la base de datos y borrarla lo cual no es muy comodo.
En cada migration de definen dos metodos principales el self.up y el self.down, la idea es que en el self.up escribas el codigo necesario para la creación de una tabla el modificiado o lo que sea que desees hacer en esa migration y en el self.down escribas el codigo necesario para revertir ese cambio, a continuacion voy a poner una lista con las operaciones que se pueden realizar en las migrations:
create_table
create_table nombre_de_tabla opciones_de_creacion do |table|
table.options nombre_del_campo, aditional_options
end
En cada migration de definen dos metodos principales el self.up y el self.down, la idea es que en el self.up escribas el codigo necesario para la creación de una tabla el modificiado o lo que sea que desees hacer en esa migration y en el self.down escribas el codigo necesario para revertir ese cambio, a continuacion voy a poner una lista con las operaciones que se pueden realizar en las migrations:
Table Options (table 1.1):
- string (crea una campo del tipo string)
- boolean (crea un campo del tipo boolean)
- integer (crea un campo del tipo integer)
- float (crea un campo del tipo float)
- date (crea un campo del tipo date)
- datetime (crea un campo del tipo datetime)
- remove (quita un campo de la tabla, se utiliza solo para el change_table)
- references (crea un campo utilizando el nombre del campo + "_id")
- remove_references (quita un campo que tiene el nombre del campo + "_id")
- change (cambia un campo, solo se utiliza para el change_table)
- change_default (cambia el valor por defecto de un campo)
- index (crea un indice para un atributo de la tabla)
- remove_index (quita un indice a determinado atributo)
- timestamp (crea dos campos un es created_at y otro updated_at)
- remove_timestamps (quita dos campos created_at y updated_at, solo se utilza en el change_table)
- rename (cambia el nombre del atributo)
create_table
create_table nombre_de_tabla opciones_de_creacion do |table|
table.options nombre_del_campo, aditional_options
end
En options puede ir cualquiera de las opciones que esta dentro de table 1.1
En opciones_de_creacion puede ir cualquiera de las siguientes opciones
- id - Por defecto esta true, si esta en true crea un atributo con el nombre id y el tipo integer
- primary_key - Por defecto toma como primary_key al id, pero se le puede indicar cualquier campo de
- force - Por defecto esta en false, si esta en true nos indica que se cree la tabla aunque exista, en false indica lo contrario
Nota:
- Por defecto crea la primary key como id se pude cambiar utilizando las opciones.
Ejemplos
create_table :users do |table|
table.string :nombre
table.date :fecha_nacimiento
table.boolean :activo
end
Crea una tabla llamada users con los siguientes campos id como primary key, nombre del tipo string, fecha_nacimiento del tipo date, y activo del tipo boolean.
create_table :users, :id => false, :force => true do |table|
table.string :nombre
table.date :fecha_nacimiento
end
Crea una tabla llamada users (aunque ya exista) con los siguientes campos nombre del tipo string y fecha_nacimiento del tipo date.
create_table :users, :id => false, :force => true do |table|
table.string :nombre
table.date :fecha_nacimiento
table.references :event
end
Crea una tabla llamada users (aunque ya exista) con los siguientes campos nombre del tipo string, fecha_nacimiento del tipo date y event_id del tipo integer.
change_table
change_table nombre_de_tabla opciones_de_creacion do |table|
table.options nombre_del_campo, aditional_options
end
change_table nombre_de_tabla opciones_de_creacion do |table|
table.options nombre_del_campo, aditional_options
end
El change_table es basicamente igual que el create_table en cuanto a sus opciones (ver la tabla 1.1), pero su accion es cambiar una tabla, esta debe existir.
Ejemplos
change_table :users do |table|
table.string :nombre, :default => "pepe"
table.remove :fecha_nacimiento
end
Este ejemplo agrega a la tabla users un campo nombre del tipo string que su valor por defecto es "pepe" y quita de la tabla el campo fecha de nacimiento (el mismo debe existir en la tabla).
change_table :users do |table|
table.index :type
table.remove_references :event
end
Este ejemplo crea un indice para el atributo type y quita el campo event_id.
change_table :users do |table|
table.change_default :nombre, "raul"
table.change :edad, :integer, :default => 0
table.timestamp
end
Este ejemplo cambia el tipo por defecto del campo nombre por "raul", cambia el tipo de edad para integer y le asigna el valor por defecto 0, y crea dos campos created_at y updated_at que indican cuando fue creado el usuario y cuando se modifico
drop_table
drop_table nombre_de_tabla
Esta sentencia nos permite eliminar una tabla
Ejemplo
drop_table :users
Schema.rb
El archivo schema.rb alamacena la estructura de la base de datos actual de tu sistema, este archivo es util para saber como tenemos la base de datos, pero tambien sierve para importar el archivo en caso de que ocurra un error en las migrations y no podamos volver para atras o para adelante el esquema
Para exportar la base de datos a al archivo schema.rb
rake db_schema_dump (es recomendable correr este comando cada vez que corremos migrations )
Para importar a la base de datos el archivo schema.rb
rake db_schema_import (es importante destacar que cuando ocurre algun error ejecutando este comando nos tenemos que fijar que en la creación de las tablas este la clausula :forece => true)
Para exportar la base de datos a al archivo schema.rb
rake db_schema_dump (es recomendable correr este comando cada vez que corremos migrations )
Para importar a la base de datos el archivo schema.rb
rake db_schema_import (es importante destacar que cuando ocurre algun error ejecutando este comando nos tenemos que fijar que en la creación de las tablas este la clausula :forece => true)
viernes, 24 de octubre de 2008
Estructura de un proyecto rails
Ahoara vamos a mostrar de que se compone la estructura basica de un proyecto en rails
- App - Aquí es donde va a estar el código fuerte de nuestra aplicación
- Config - Este directorio contiene la configuración de las bases de datos que vamos a utilizar en nuestra aplicación y de sus entornos de ejecución, rails propone tres entornos por defecto los cuales son desarrollo, test y producción.
- Db - Aquí se almacenan las migrations, que son archivos que te ayudan a construir o reconstruir tu base de datos.
- Doc - Este directorio se utiliza para documentación de tu aplicación, puedes hacerlo utilizando el comando rake
- Lib - Código escrito en Ruby al cual podremos acceder desde cualquier lugar de nuestra aplicación.
- Log - En este directorio se almacenaran los log del servidor para los distintos entornos de tu aplicación.
- Public - Es el directorio del servidor web donde se encuentra todo el contenido estático de la aplicación, también se encuentran los dispatcher en este directorio.
- Script - Contiene scripts que se utilizan para generar código rails.
- Test - Directorio en el que se almacenan las pruebas unitarias, funcionales y de integración que se utilizan para probar la aplicación
- Vendor - Directorio en el que se encuentran los plugins que utilicemos para nuestra aplicación.
jueves, 23 de octubre de 2008
Iterar un array con los indicies
Ruby tiene una funcion que nos permite recorrer un array o un hash, esta función lo que hace es devolvernos los elementos y el indice en el cual se encuentran estos elementos.
["a", "b", "1"].each_with_index do |elemento, indice|
"Aca hacemos lo que queremos con el elemento #{elemento} y con el indice #{indice}"
end
Suscribirse a:
Entradas (Atom)