Dagi3d v4

Actualización de Acts As Flying Saucer

Hace poco me enviaron un correo con un par de bugs que habían encontrado en el plugin que escribí para generar pdfs desde Rails y y­a están solucionados:

­Antes se añadía por defecto la opción x_sendfile a la hora de enviar el pdf al cliente, pero en según qué entornos puede generar un fichero vacio(por ejemplo cuando estemos en desarrollo con mongrel), por lo que ahora se ha eliminado, pero se puede pasar como parámetro de send_file cuando sea necesario:

class FooController < ApplicationController
  
  acts_as_flying_saucer
  
  def index
    render_pdf :send_file => { :filename => 'bar.pdf', :x_sendfile => true}
  end
end­

La librería Flying Saucer necesita que las llamadas a los recursos(imágenes y hojas de estilo) sean llamadas de manera absoluta. Antes el plugin convertía las llamadas en rutas locales pero entonces no se podían usar los assets hosts, por lo que ahora se convierten en llamadas remotas y en caso de no especificar ningún asset host, se utiliza el mismo desde el que se este solicitando el documento:


# HTML 
<%= stylesheet_link_tag("styles.css") %>
<link href="/stylesheets/styles.css?1228586784" media="screen" rel="stylesheet" type="text/css">

<%= image_tag("rails.png") %>
<img alt="Rails" src="/images/rails.png?1228433051">

# PDF
<%= stylesheet_link_tag("styles.css") %>
<link href="http://localhost:3000/stylesheets/styles.css" media="print" rel="stylesheet" type="text/css">

<%= image_tag("rails.png") %>
<img alt="Rails" src="http://localhost:3000/images/rails.png">

Commit

Gracias a Max Williams por el feedback

Cambiando la locale de una clase en Globalize2

En el último proyecto que estuve realizando con RoR necesitaba ofrecer soporte multiidioma para los modelos así que opté por utilizar Globalize2 ya que ya había estado trasteando con esta librería y me parecía muy cómoda de usar(aunque todavía le quedan algunas cosas por pulir).

El caso es que desde hace relativamente poco permite cambiar la locale de una clase en concreto sin necesidad de cambiar el idioma de toda la aplicación. Así se podría tener nuestra aplicación en un idioma determinado y trabajar con una instancia de un modelo en otro totalmente distinto.

El problema era que con la implementación actual, si se cambiaba la locale de una clase en concreto, se cambiaba automáticamente en todas las demás clases que tuvieran campos traducibles con Globalize2:­ 

­I18n.locale = 'es'
Post.locale = 'en'
Post.locale         # en
Category.locale     # en <- WTF?!

Esto sucede por la utilización de variables de clase y la implementación de éstas en Ruby­. Con Ruby, si se modifica el valor de una variable de clase que ha heredado de otra, cambiará en todas las demás clases que hereden de la misma:


class Polygon
  @@sides = 0

  def self.sides
    @@sides
  end
end

class Triangle < Polygon
  @@sides = 3
end

class Square < Polygon
­  @@sides = 4
end

Triangle.sides # 4 <- WTF?!­
Rails provee un mecanismo para solucionar esto a través de los métodos write_inheritable_attribute y read_inheritable_attribute, así que escribí un mini parche para este plugin de Rails. Aquí el commit del fork en Github

acts_as_flying_saucer: plugin para generar documentos pdf con Rails

flying-saucerParece que la cosa sigue yendo de reescribir código antiguo ya que a raiz de un comentario en  el post sobre ­cómo generar documentos pdf en una aplicación Rails con la librería Flying Saucer, he empaquetado el sistema en un plugin con lo que ahora resulta realmente sencillo poder convertir una vista en un pdf.
Además ya no hace falta preocuparse por las rutas de las hojas de estilos e imágenes(para escribir el pdf éstas tenían que apuntar a recursos locales) ya que cambiarán automáticamente dependiendo de si estamos renderizando la vista en el navegador o estamos guardando el pdf.

Para hacerlo funcionar basta con instalar el plugin:

­./script/plugin install git://github.com/dagi3d/acts_as_flying_saucer.git­­

y llamar al método de clase acts_as_flying_saucer en nuestro controlador. Entonces ya estará disponible el método render_pdf que admite las opciones de ActionController::Base#render. Además se puede indicar el nombre del fichero pdf que queramos generar así como mandarlo al cliente.

Más información en el repositorio de Github: ­http://github.com/dagi3d/acts_as_flying_saucer/

­­

Programa de facturación en Ruby On Rails II

Hace un tiempo escribí una aplicación bastante simple para generar facturas y aprovechando que salió hace poco la última versión estable de Rails, la modifiqué para hacerla funciona con la versión 2.2.x y ya de paso limpiar un poco el código. Se puede descargar desde github en http://github.com/dagi3d/facturails/ y la demo sigue estando en http://facturails.dagi3d.net/

Mi primer meme chispas

Aunque en el blog no suelo tratar estos temas, me parecía un poco feo no recoger el meme que me han pasado(ya me había hecho el sueco anteriormente) ya que esta vez me ha venido por partida doble(King George y mabarroso), así que aquí va:

1. Nombre completo.
Borja.

2. Por qué tienes ese nombre.
La verdad es que no tengo ni idea si tenía algún significado especial para mis padres. Lo que sí sé es que si no llega a ser por mi abuela me habría acabado llamando Jacobo ya que esa era la primera opción pero ella se negó en redondo porque decía que era nombre de mayordomo(eh, que lo dijo ella, no yo).

3. ¿Cuándo fue la última vez que lloraste?
Hace poco.

4. El pan te gusta ¿con qué?
Con casi cualquier cosa. Como mucho pan, diría que demasiado aunque últimamente me estoy cortando bastante. Si me descuido me puedo comer una barra de pan enterita yo solo. A veces creo que podría acabar comiéndome un bocadillo de pelos si se terciara.

5. ¿Te desabrochas los zapatos antes de sacártelos?
No porque ya los llevo desabrochados. Suelo llevar los zapatos sueltecicos y los cordones van por dentro y así no tengo que abrocharlos. Vago que es uno(aunque prefiero llamarlo optimización de recursos).

6. ¿A qué dos personas meterías en una habitación como la de Saw para que se aniquilasen entre ellas?
Así a bolapié, no odio a nadie tanto como para hacer algo así, pero si tuviera que elegir a algún personaje que me produce urticaría, creo que escogería a Mercedes Milá y Fedeguico Jiménez Losantos.

7. ¿A quién extrañas mucho?
A mi madre. Todos los días.

8. Lo último que comiste hoy.
Dos manzanas granny smith, uvas y un tazón de cereales para cenar.

9. ¿Qué estás escuchando en este momento?
El último de Guns n' Roses. No me gustan pero tenía curiosidad por saber cómo sonaba el disco más caro de la historia y ver qué habían hecho en los últimos 12 años, así que igual de rápido que llegó, acabará en la papelera de reciclaje.

11. ¿Cómo te cae la persona que te envió esto?
Estupendamente los dos.
Del señor King George destacar su sentido del humor y del señor Barroso su caracter afable. De hecho creo que es la única persona que no consigo imaginarme alzando la voz. Además son dos excelentes compis de curro y profesionales cada uno en lo suyo.

12. Comida favorita.
El arroz, ya sea en paella o arroz negre.

13. Última peli que viste en el cine.
Creo que fue la de Wall-E. Me encantan los trabajos de Pixar.

14. Postre preferido.
Todo lo que sea dulce me gusta pero diría que el que más son las natillas. De pequeño llegué a tomarme ocho en el buffete de un hotel.

15. ¿Qué libro estás leyendo?
En el cuarto de baño tengo 'The Rails Way' como libro de 'cabecera' y voy leyendo a ratos 'Hablemos de langostas', de David Foster Wallace.

16. ¿Qué hay en la pared de tu cuarto?
Un corcho con fotos y recuerdos y una diana eléctronica para jugar a los dardos.

17. ¿Qué viste anoche en la tele?
Nada, estaba haciendo el canelo por ahí.

18. ¿Cuál es la última comida que preparaste?
Merluza enterrada del libro 'Sigue cocinando en 22 minutos' del gran Julius para la hora de comer.

19. Un sitio para desaparecer.
Cualquier sitio con playa me vale.

20. Algo que no sepas hacer

Tirarme de cabeza en la piscina. Y no es algo de lo que me sienta precisamente orgulloso...

Por aquello de evitar la maldición que provocaría siete años de infelicidad si rompiese la cadena, le paso el meme a las siguientes personas:
Sowe
Josek
Edu
Adrián