En un par de días desarrolle un pequeño plugin rails que puede ser útil mientras estamos desarrollando nuestro proyecto. El plugin se llama todo_list.

La idea es simple, el plugin recorre nuestros archivos .rb buscando comentarios del tipo #TODO:, #NOTE, etc. y a partir de ellos crea listas de tareas.

El formato de los comentarios que entiende son:

#TODO: es una tarea
#IDEA: es una idea
#NOTE: es una nota
#REMOVE: código pendiente de eliminar
#DEBUG: código para revisar
#TEST: código para probar
#DEF: descripción de un método
#CHANGE: código que se debe cambiar
#QUESTION: preguntas pendientes
#FIXME: codigo con errores conocidos

Para instalarlo

./script/plugin install http://todo-list-rails-plugin.googlecode.com/svn/trunk/todo_list/


Luego en cualquier vista de nuestro proyecto

<%= todo_list %>

Ahora obtenemos un menú que nos permite navegar entre nuestras listas de tareas, notas, ideas, metodos, debug, etc.

Las listas se separan dependiendo del tipo de comentario, por lo que vamos a tener una lista para cada formato soportado. En cada lista, las tareas se ven separadas por archivos y muestra en que linea esta.

Tengo que aclarar que el plugin no fue testeado, de todas maneras es simple y su uso es solo
para desarrollo.

Necesita Rails 1.2.0 o posterior para funcionar, si no lo tenemos vamos a necesitar el plugin engines.

Desde Ruby on Rails hay varias formas de generar archivos pdf, pero para realizar mi traductor yo me decide por PDF::Writer así voy a dar una breve explicación de como utilizarlo.

PDF::Writer se pude instalar como gem y necesita de dos paquetes más para funcionar, estos son los pasos..

sudo gem install transaction-simple
sudo gem install color-tools
sudo gem install pdf-writer

Luego de tener todo instalao, debemos introducir en el controlador que utilicemos para generar los pdf lo siguiente

require.png

Ahora vamos a hacer un pdf que muestra los datos de un array en una tabla, es recomendable tener a mano el manual y la referencia a la API de PDF::Writer.

pdf.png


El traductor tenia dos problemas con los caracteres especiales, uno era cuando se colocaba texto para traducir, ahí caracteres especiales se estaban mandando mal al traductor de google por lo tanto después se veían mal.

El otro era cuando exportamos a pdf, todos lo caracteres especiales se veían mal porque PDF::Writer no soporta utf-8.

El primer problema era solo porque no estaba mandando un campo oculto que tiene el formulario del traductor de google, en donde el valor era utf-8, asi que solo agregando ese campo al post, el problema quedo listo.

El segundo problema lo solucione con ayuda de la lista de ror en ingles, donde buscando vi que alguien ya había tenido ese problema con PDF::Writer, la solución fue agregar un método que transformara el texto de formato. Aquí dejo el método que implemente para solucionar el problema.

pasar_a_iso

Cuando desarrollamos una aplicacion web, es muy comun que tengamos una parte para el administrador y otra habilitada para los visitantes de la web. En Ruby on Rails, generalemente esto esta diferenciado por los controladores, y cada uno utiliza un layout determinado.

Pero que pasa si hay un controlador que da funcionalidad a las dos partes, por ejemplo un controlador search que nos da la posibilidad de realizar busquedas, puede ser utilizado desde la web y desde la administracion. El problema aca es que al controlador se le asigna un layout, y para nuestro caso no deberia ser el mismo para el administrador que para nuestros visitantes.

Asi que aqui voy a dejar un metodos que he utilizado para solucionar este problema, y otro para cuando el layout que desamos mostrar depende del metodo que estamos ejecutando.

Diferenciar entre admin y web

Aqui vmos a seleccionar el layout dependiedo si estamos logeados o no en el sistema, esta de mas decir que admin es para cuando lo estamos y web para cuando no.

En el controlador que vamos a seleccionar el layot dinamicamente colocamos:

layout :seleccionar_layout

Y tenemos que definir el metodo seleccionar_layout en el mismo controlador o en aplication si lo vamos a utilizar mas de una ves. El metodo serias asi:

def seleccionar_layout
if logged_in?
'admin'
else
'web'
end
end

Hay que tener en cuenta que el metodo logged_in? nos debe de indicar si estamos loggeados en el sistema o no. Este metodo es del plugin acts_as_authenticated.

Diferenciar entre metodos del mismo controller

Ahora haremos un metodo que selecciona el layout dependiendo del metodo que estemos llamando. Y aqui esta:

def seleccionar_layout
case action_name
when 'list' : 'layout_list'
when 'new' : 'layout_new'
when 'edit' : 'layout_edit'
end
end