<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>http://dagi3d.net/blog/</id>
  <title>dagi3d</title>
  <link type="text/xml" rel="self" href="http://dagi3d.net/blog/atom/"/>
  <link type="text/html" rel="alternate" href="http://dagi3d.net/blog/"/>
  <updated>2009-08-16T22:43:44Z</updated>
  <author>
    <name>dagi3d</name>
  </author>
  <entry>
    <title>Actualizaci&#243;n de Acts As Flying Saucer</title>
    <link type="text/html" rel="alternate" href="http://dagi3d.net/blog/archive/2009/8/16/actualizacion-de-acts-as-flying-saucer"/>
    <id>http://dagi3d.net/blog/archive/2009/8/16/actualizacion-de-acts-as-flying-saucer</id>
    <published>2009-08-16T22:43:44Z</published>
    <updated>2009-08-16T22:43:44Z</updated>
    <content type="html">
      <![CDATA[<p>Hace poco me enviaron un correo con un par de bugs que habían encontrado en el plugin que escribí para <a href="/blog/archive/2008/12/06/acts_as_flying_saucer-plugin-para-generar-documentos-pdf-con-rails">generar pdfs desde Rails</a> y y­a están solucionados:</p>
  <p>­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:</p>
<p><code></code><br />
  <pre><br />
class FooController &lt; ApplicationController<br />
  <br />
  acts_as_flying_saucer<br />
  <br />
  def index<br />
    render_pdf :send_file =&gt; { :filename =&gt; &#8216;bar.pdf&#8217;, :x_sendfile =&gt; true}<br />
  end<br />
end­<br />
</pre><br />
  <p></p>
<p>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:</p><br />
  <pre><code></p>
<ol>
	<li><span class="caps">HTML</span> <br />
&lt;%= stylesheet_link_tag(&#8220;styles.css&#8221;) %&gt;<br />
&lt;link href=&#8220;/stylesheets/styles.css?1228586784&#8221; media=&#8220;screen&#8221; rel=&#8220;stylesheet&#8221; type=&#8220;text/css&#8221;&gt;</li>
</ol>
<p>&lt;%= image_tag(&#8220;rails.png&#8221;) %&gt;<br />
&lt;img alt=&#8220;Rails&#8221; src=&#8220;/images/rails.png?1228433051&#8221;&gt;</p>
<ol>
	<li><span class="caps">PDF</span><br />
&lt;%= stylesheet_link_tag(&#8220;styles.css&#8221;) %&gt;<br />
&lt;link href=&#8220;http://localhost:3000/stylesheets/styles.css&#8221; media=&#8220;print&#8221; rel=&#8220;stylesheet&#8221; type=&#8220;text/css&#8221;&gt;</li>
</ol>
<p>&lt;%= image_tag(&#8220;rails.png&#8221;) %&gt;<br />
&lt;img alt=&#8220;Rails&#8221; src=&#8220;http://localhost:3000/images/rails.png&#8221;&gt;<br />
</code><br />
</pre><br />
  <p><a href="http://github.com/dagi3d/acts_as_flying_saucer/commit/52e3c71cc92bd36622232adb4608a1aa872ab087">Commit</a></p><br />
  <p>Gracias a <a href="http://webcrisps.wordpress.com/">Max Williams</a> por el feedback<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br /></p></p>]]>
    </content>
  </entry>
  <entry>
    <title>Cambiando la locale de una clase en Globalize2</title>
    <link type="text/html" rel="alternate" href="http://dagi3d.net/blog/archive/2009/4/10/cambiando-la-locale-de-una-clase-en-globalize2"/>
    <id>http://dagi3d.net/blog/archive/2009/4/10/cambiando-la-locale-de-una-clase-en-globalize2</id>
    <published>2009-04-10T12:07:18Z</published>
    <updated>2009-04-10T12:07:18Z</updated>
    <content type="html">
      <![CDATA[<p>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).</p>
  <p>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<br />
    y trabajar con una instancia de un modelo en otro totalmente distinto.</p>
  <p>El problema era que con la implementación actual, si se cambiaba la locale de una clase en concreto, se cambiaba automáticamente en <strong>todas</strong> las demás clases que tuvieran campos traducibles con Globalize2:­&nbsp;<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br /></p>
<pre><code>­I18n.locale = 'es'
<p>Post.locale = &#8216;en&#8217;<br />
Post.locale &nbsp;       # en<br />
Category.locale     # en &lt;- <span class="caps">WTF</span>?!<br />
</code></pre><br />
  <p>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:</p><br />
  <pre><code>
class Polygon
  @@sides = 0</p>
def self.sides
@@sides
end
<p>end</p>
<p>class Triangle &lt; Polygon<br />
  @@sides = 3<br />
end</p>
<p>class Square &lt; Polygon<br />
­  @@sides = 4<br />
end</p>
<p>Triangle.sides # 4 &lt;- <span class="caps">WTF</span>?!­<br />
</code></pre><br />
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.&nbsp;<a href="http://github.com/dagi3d/globalize2/commit/5026a20fcb975655d5f0568ca3b6b82d449c0fe7">Aquí el commit del fork en Github</a><br />
  <br /></p>]]>
    </content>
  </entry>
  <entry>
    <title>acts_as_flying_saucer: plugin para generar documentos pdf con Rails</title>
    <link type="text/html" rel="alternate" href="http://dagi3d.net/blog/archive/2008/12/6/acts_as_flying_saucer-plugin-para-generar-documentos-pdf-con-rails"/>
    <id>http://dagi3d.net/blog/archive/2008/12/6/acts_as_flying_saucer-plugin-para-generar-documentos-pdf-con-rails</id>
    <published>2008-12-06T23:40:01Z</published>
    <updated>2008-12-06T23:40:01Z</updated>
    <content type="html">
      <![CDATA[<p><img align="right" src="http://i224.photobucket.com/albums/dd174/dagi3d/flying-saucer.png" alt="flying-saucer" />Parece que la cosa sigue yendo de reescribir código antiguo ya que a raiz de un comentario en&nbsp; el post sobre ­<a href="/blog/archive/2007/06/28/generar-documentos-pdf-con-rails-y-flying-saucer">cómo<br />
generar documentos pdf en una aplicación Rails</a> con la librería Flying Saucer, he empaquetado el<br />
sistema en un plugin con lo que ahora resulta realmente sencillo poder convertir una vista en un pdf.<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />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 <br />
  o estamos guardando el pdf.</p>
  <p>Para hacerlo funcionar basta con instalar el plugin:</p>
  <p>­<code>./script/plugin install git://github.com/dagi3d/acts_as_flying_saucer.git­­ </code></p>
  <p>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.</p>
  <p>Más información en el repositorio de Github: ­<a href="http://github.com/dagi3d/acts_as_flying_saucer/">http://github.com/dagi3d/acts_as_flying_saucer/<br />
    </a><br />
    <br /></p><p>­­</p>]]>
    </content>
  </entry>
  <entry>
    <title>Programa de facturaci&#243;n en Ruby On Rails II</title>
    <link type="text/html" rel="alternate" href="http://dagi3d.net/blog/archive/2008/12/1/programa-de-facturacion-en-ruby-on-rails-ii"/>
    <id>http://dagi3d.net/blog/archive/2008/12/1/programa-de-facturacion-en-ruby-on-rails-ii</id>
    <published>2008-12-01T00:26:32Z</published>
    <updated>2008-12-01T00:26:32Z</updated>
    <content type="html">
      <![CDATA[<p>Hace un tiempo escribí una <a href="/blog/archive/2007/08/15/programa-de-facturacion-en-ruby-on-rails">aplicación bastante simple para generar facturas</a> 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 <a href="http://github.com/dagi3d/facturails/">http://github.com/dagi3d/facturails/</a> y la demo sigue estando en <a href="http://facturails.dagi3d.net/">http://facturails.dagi3d.net/</a><br />
  <br /></p>]]>
    </content>
  </entry>
  <entry>
    <title>Mi primer meme chispas</title>
    <link type="text/html" rel="alternate" href="http://dagi3d.net/blog/archive/2008/11/22/mi-primer-meme-chispas"/>
    <id>http://dagi3d.net/blog/archive/2008/11/22/mi-primer-meme-chispas</id>
    <published>2008-11-22T21:33:11Z</published>
    <updated>2008-11-22T21:33:11Z</updated>
    <content type="html">
      <![CDATA[<p>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(<a href="http://www.banthastudio.com/blog/?p=111">King George</a> y <a href="http://www.mabarroso.com/2008/11/meme-en-to-en-toooo.html">mabarroso</a>), así que aquí va:<br />
    <br />
    <br />
    <br />
    <br /></p>
  <p><strong>1. Nombre completo.<br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>Borja.<strong><br />
      <br /></strong></p>
  <p><strong>2. Por qué tienes ese nombre. <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>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).<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br /><strong><br />
      <br />3. ¿Cuándo fue la última vez que lloraste? <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>Hace poco.<strong><br />
      <br /><br />
      <br />4. El pan te gusta ¿con qué? <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>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.<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br /><strong><br />
      <br />5. ¿Te desabrochas los zapatos antes de sacártelos? <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>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).<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br /><strong><br />
      <br />6. ¿A qué dos personas meterías en una habitación como la de Saw para que se aniquilasen entre ellas? <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>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.<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br /><strong><br />
      <br />7. ¿A quién extrañas mucho? <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>A mi madre. Todos los días.<br />
    <br />
    <br />
    <br />
    <br /><strong><br />
      <br />8. Lo último que comiste hoy.<br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>Dos manzanas granny smith, uvas y un tazón de cereales para cenar.<strong><br />
      <br /><br />
      <br />9. ¿Qué estás escuchando en este momento? <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>El último de Guns n&#8217; 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.<br />
    <br />
    <br />
    <br />
    <br /><strong><br />
      <br />11. ¿Cómo te cae la persona que te envió esto? <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>Estupendamente los dos.<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />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.<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br /><strong><br />
      <br />12. Comida favorita. <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>El arroz, ya sea en paella o arroz negre.<br />
    <br />
    <br />
    <br />
    <br />
    <br /><strong><br />
      <br />13. Última peli que viste en el cine. <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>Creo que fue la de Wall-E<strong>.</strong> Me encantan los trabajos de Pixar.<br />
    <br />
    <br />
    <br />
    <br />
    <br /><strong><br />
      <br />14. Postre preferido. <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>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.<br />
    <br />
    <br />
    <br />
<br />
    <br />
    <br /><strong><br />
      <br />15. ¿Qué libro estás leyendo? <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>En el cuarto de baño tengo &#8216;The Rails Way&#8217; como libro de &#8216;cabecera&#8217; y voy leyendo a ratos &#8216;Hablemos de langostas&#8217;, de David Foster Wallace.<br />
      <strong><br />
      <br /></strong></p>
  <p><strong>16. ¿Qué hay en la pared de tu cuarto? <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>Un corcho con fotos y recuerdos y una diana eléctronica para jugar a los dardos.<strong><br />
      <br /><br />
      <br />17. ¿Qué viste anoche en la tele? <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>Nada, estaba haciendo el canelo por ahí.<strong><br />
      <br /><br />
      <br />18. ¿Cuál es la última comida que preparaste? <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>Merluza enterrada del libro &#8216;Sigue cocinando en 22 minutos&#8217; del gran Julius para la hora de comer.<strong><br />
      <br /><br />
      <br />19. Un sitio para desaparecer. <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br />
      <br /></strong>Cualquier sitio con playa me vale.<strong><br />
      <br /><br />
      <br />20. Algo que no sepas hacer</strong><br />
    <br />Tirarme de cabeza en la piscina. Y no es algo de lo que me sienta precisamente orgulloso&#8230;    </p>
  <p>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:<br />
    <br />
    <br />
    <br />
    <br /><a href="http://www.hefesto.org/blog/">Sowe</a><br />
    <br /><a href="http://josekblog.blogspot.com/">Josek</a><br />
    <br /><a href="http://www.clubcraem.net/mrmamba">Edu</a><br />
    <br /><a href="http://comunidad.uem.es/ayanes">Adrián</a><br />
    <br /><br />
    <br /></p>
  <p>&nbsp;</p>]]>
    </content>
  </entry>
  <entry>
    <title>Probando Globalize2</title>
    <link type="text/html" rel="alternate" href="http://dagi3d.net/blog/archive/2008/11/10/probando-globalize2"/>
    <id>http://dagi3d.net/blog/archive/2008/11/10/probando-globalize2</id>
    <published>2008-11-10T00:53:13Z</published>
    <updated>2008-11-10T00:53:13Z</updated>
    <content type="html">
      <![CDATA[<p>
<p>Vi que se había liberado hace poco una <a href="http://github.com/joshmh/globalize2/tree/master">nueva versión de Globalize</a>, el plugin para Rails que permite tener traducciones de nuestros modelos, así que me animé a probarlo. Ahora es compatible con Rails 2.2 y hace uso de la nueva api para la internacionalización de nuestras aplicaciones. Además, ahora en lugar de tener una única tabla con todas las traducciones, hay que crear una tabla adicional para cada modelo con los campos que queramos que sean traducibles(tal como hace el plugin <a href="http://www.samlown.com/en/page/RailsTranslateColumnsPluginReadme">translate_columns</a> de Samuel Lown). Por ahora hay que escribir la migración a mano, pero se planea hacer un generator para automatizar este paso(si saco un momentillo igual me animo a escribirlo yo, que nunca hice uno). <br />
    <br />
    <br />
    <br />
    <br />De momento parece que funciona bastante bien, salvo un detalle que me tuvo entretenido un buen rato y que comento por si alguien se encuentra en la misma situación.</p><br />
  <p>En todos los ejemplos de la documentación aparece que podemos indicar la nueva locale usando un símbolo, pero resulta que si lo hacemos así, no se puede recuperar luego el campo traducido(aunque sí que se guarda correctamente en la base de datos) y lo que hay que hacer es utilizar cadenas en su lugar.<br />
   <br /></p><br />
  <p>Supongamos que tenemos la clase Post con la siguiente migración:</p><code></code><br />
  <pre># Post<br />
class Post &lt; ActiveRecord::Base<br />
  translates :title<br />
end­<br />
­­</pre><br />
  <pre># CreatePosts<br />
class CreatePosts &lt; ActiveRecord::Migration<br />
  def self.up<br />
    create_table :posts do |t|<br />
      t.timestamps<br />
    end<br />
    create_table :post_translations, :force =&gt; true do |t|<br />
      t.references :post<br />
      t.string :locale<br />
      t.string :title<br />
      t.timestamps<br />
    end<br />
  end</p>
def self.down
drop_table :post_translations
drop_table :posts
end
<p>end<br />
</pre><br />
  <p></p>
<p>Podemos ver que si usa­­mos un símbolo para nuestra locale, el campo nos devuelve un nil, pero si usamos una cadena, devuelve el valor correcto:</p><br />
  <pre>gambitero:rails-test dagi3d$ ./script/console <br />
Loading development environment (Rails 2.2.0)<br />
&gt;&gt; I18n.locale = :es<br />
=&gt; :es<br />
&gt;&gt; post = Post.new(:title =&gt; &#8216;titulo&#8217;)<br />
=&gt; #&lt;post id:=&quot;&quot; created_at:=&quot;&quot; nil,=&quot;&quot; updated_at:=&quot;&quot; nil=&quot;&quot;&gt;<br />
&gt;&gt; post.title<br />
=&gt; nil<br />
&gt;&gt; I18n.locale = &#8220;es&#8221;<br />
=&gt; &#8220;es&#8221;<br />
&gt;&gt; post.title = &#8220;titulo&#8221;<br />
­=&gt; &#8220;titulo&#8221;<br />
&gt;&gt; post.title<br />
=&gt; &#8220;titulo&#8221;<br />
&gt;&gt; I18n.locale = &#8220;en&#8221;<br />
=&gt; &#8220;en&#8221;<br />
&gt;&gt; post.title = &#8220;title&#8221;<br />
=&gt; &#8220;title&#8221;<br />
&gt;&gt; I18n.locale = &#8220;es&#8221;<br />
=&gt; &#8220;es&#8221;<br />
&gt;&gt; post.title<br />
=&gt; &#8220;titulo&#8221;</p>
<p></post></pre><br />
  <p></p>
<p>También­ comentar que si tenemos traducido un campo en la locale por defecto(inicialmente ésta es &#8216;en-US&#8217;) e intentamos acceder a un atributo de una que todavía no tiene ningún valor asignado, se devolverá el valor de la locale por defecto. Si queremos evitar este comportamiento basta con comentar la línea 26 del fichero vendor/plugins/globalize2/lib/globalize/locale/fallbacks.rb para que no añada ésta a la lista de fallbacks(otra opción sería redefinir el constructor de la clase Globalize::Locale::FallBacks)</p><br />
  <p>Por último decir que de momento la asociación que se crea entre nuestra clase y la generada por el plugin con las traducciones no se carga con &#8216;eager loading&#8217; pero es una cosa que tienen prevista hacer.</p>
</p>]]>
    </content>
  </entry>
  <entry>
    <title>IV Jornadas de Inform&#225;tica de la Universidad Europea de Madrid</title>
    <link type="text/html" rel="alternate" href="http://dagi3d.net/blog/archive/2008/10/31/iv-jornadas-de-informatica-de-la-universidad-europea-de-madrid"/>
    <id>http://dagi3d.net/blog/archive/2008/10/31/iv-jornadas-de-informatica-de-la-universidad-europea-de-madrid</id>
    <published>2008-10-31T02:20:24Z</published>
    <updated>2008-10-31T02:20:24Z</updated>
    <content type="html">
      <![CDATA[<p><img align="left" src="http://s3.amazonaws.com/twitter_production/profile_images/62198514/Untitled-1_bigger.png" />Del 17 al 21 de Noviembre, la <a href="http://www.uem.es">Universidad Europea de Madrid</a> organiza las IV Jornadas de Informática, centradas este año en internet y sobre todo en su componente social y colaborativo. <br />
    Durante las jornadas, personalidades relacionadas con la web 2.0 y su<br />
dimensión social, como Enrique Dans, Javier Pereira (Microsiervos),<br />
Alberto Vazquez Figueroa, Carlos Blanco (ITNet), Jesús Encinar<br />
(Idealista), Rodolfo Carpintier (<span class="caps">DAD</span>), Emilio Marquez (Networking<br />
Activo), Carlos Magro y Javier Cuervo (Madri+D), entre otros, expondrán<br />
sus puntos de vista sobre la tecnología, la sociedad, los derechos de<br />
autor y muchos otros temas de actualidad.<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />También vendrán de La Coctelera a hablarnos sobre The Shaker, la plataforma de blogs que utilizan algunas empresas como 20 Minutos, El País, Telecinco y la propia <span class="caps">UEM</span>.<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br /></p>
  <p>Además se organizarán actividades más prácticas como un taller de música electrónica, otro de Inkscape o una introducción a la administración de OpenSolaris entre otras.<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br /></p>
  <p>Todas las actividades son de libre acceso aunque algunas requieren de un registro previo(basta con mandar un simple correo) para poder asistir.</p>
  <p>Más información en la propia <a href="http://www.esp.uem.es/jornadas08">web de las jornadas</a>, en su <a href="http://twitter.com/jiuem08">cuenta de Twitter</a> y en el <a href="http://www.facebook.com/event.php?eid=45934945750">evento de Facebook</a>. <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br /></p>
  <p>También comentar que he tenido el placer de poder realizar la web de estas jornadas y aunque es bastante sencillita, me ha servido como toma de contacto a la hora de desarrollar en un entorno totalmente nuevo para mí como es MacOs y la verdad es que ha sido un gustazo poder llevar a cabo todo el proceso(diseño, maquetación, desarrollo, pruebas y deploy) dentro de un mismo entorno ya que antes me veía siempre en la necesidad de estar alternando entre Windows y Linux dependiendo de lo que quería hacer.</p>
  <p>La web está realizada con Rails y lo único así destacable es que he podido probar el plugin <a href="http://github.com/sd/embedded-actions/tree/master">embedded-actions</a> de <a href="http://www.sdelmont.com/">Sebastian Delmont</a>, que permite añadir a nuestras vistas el resultado generado por cualquier controlador y su correspondiente acción de una manera realmente sencilla. Además también he utilizado Git para el control de versiones y decir que me ha parecido realmente cómodo de utilizar. No sé si es que a Subversion no le eché demasiadas cuentas y me limitaba a usarlo a través de algún <span class="caps">IDE</span>, pero al menos con Git entiendo lo que hago y no tengo mayor problema en ejecutarlo desde la consola y me ha parecido bastante intuitivo y con un enorme potencial.<br />
    <br />
    <br />
    <br />
    <br />
    <br /></p>]]>
    </content>
  </entry>
  <entry>
    <title>Validando las asociaciones de ActiveRecord con RSpec</title>
    <link type="text/html" rel="alternate" href="http://dagi3d.net/blog/archive/2008/9/6/validando-las-asociaciones-de-activerecord-con-rspec"/>
    <id>http://dagi3d.net/blog/archive/2008/9/6/validando-las-asociaciones-de-activerecord-con-rspec</id>
    <published>2008-09-06T01:35:58Z</published>
    <updated>2008-09-06T01:35:58Z</updated>
    <content type="html">
      <![CDATA[<p>
<p>Después de estar un tiempo sin tocar Rails para nada, me puse el otro día a cacharrerar un poco con RSpec y se me ocurrió escribir un <em>matcher </em>para validar las asociaciones de los modelos, ya que consideraba que un simple <em><code>objeto.should respond_to(:metodo)&lt;/em&gt; realmente tampoco garantiza nada. 
    
    
    
    
    
    
    
    
    
    
    &lt;br /&gt;Lo único 'interesante' que puede aportar este código es que a la hora de escribir nuestros specs, basta con poner directamente el nombre de la relación, ya que la clase asociada se obtiene de manera automática(bendita sea la convención sobre la configuración :)), al contrario que el resto de ejemplos que pude encontrar por ahí, donde se indica la clase y si se desea, se indica aparte el nombre de la relación(y creo que así se aporta algo de legibilidad a los specs)
    :&lt;/p&gt;
  &lt;pre&gt;</code>record.should have_many(:songs) # utiliza la clase Song</p>
<p>@record.should belong_to(:artist) # utiliza la clase Artist­</p>
<p><code>record.should have_one(:cover) # utiliza la clase Cover
&lt;/pre&gt;
  &lt;p&gt;Si fuese necesario también se puede indicar de manera manual la clase del modelo relacionado: 
    
    
    
    
    
    
    &lt;br /&gt;&lt;/p&gt;
  &lt;pre&gt;</code>record.should have_many(:favorite_songs).from_class(Song)</pre><br />
  <pre>module ARAssociationsMatchers<br />
  <br />
  # ARAssociationMatcher<br />
  #<br />
  class ARAssociationMatcher<br />
  <br />
    def initialize(expected, macro)<br />
      <code>expected_association = expected
      @expected_macro = macro
    end
    
    def matches?(target)
      @target = target
      
      unless @expected_class.nil?
        expected_class = @expected_class
      else
        expected_class_name = @expected_association.to_s.singularize.camelize
        expected_class = Kernel.const_get(expected_class_name)
      end
      
      reflection = target.class.reflect_on_association(</code>expected_association)<br />
      <br />
      !reflection.nil? &amp;&amp; (reflection.macro == <code>expected_macro) &amp;amp;&amp;amp; (reflection.klass == expected_class)
    end
    
    def from_class(expected_class)
      @expected_class = expected_class
      self
    end
    
    def failure_message
      "expected #{</code>target.inspect} to #{@expected_macro} #{@expected_association.inspect}, but it didn&#8217;t&quot;<br />
    end<br />
    <br />
    def negative_failure_message<br />
      &#8220;expected #{@target.inspect} not to #{@expected_macro} #{@expected_association.inspect}, but it didn&#8217;t&#8221;<br />
    end<br />
    <br />
  end<br />
  <br />
  # matchers functions<br />
  #<br />
  def have_many(expected)<br />
    ARAssociationMatcher.new(expected, :has_many)<br />
  end</p>
def have_one(expected)
ARAssociationMatcher.new(expected, :has_one)
end

def belong_to(expected)
ARAssociationMatcher.new(expected, :belongs_to)
end

<p>end<br />
</pre></p>
<p>La idea inicial está tomada de ­<a href="http://smartic.us/2007/11/26/rspec-matcher-for-active-record-associations">este enlace</a></p>]]>
    </content>
  </entry>
  <entry>
    <title>Back to the world</title>
    <link type="text/html" rel="alternate" href="http://dagi3d.net/blog/archive/2008/8/21/back-to-the-world"/>
    <id>http://dagi3d.net/blog/archive/2008/8/21/back-to-the-world</id>
    <published>2008-08-21T22:44:02Z</published>
    <updated>2008-08-21T22:44:02Z</updated>
    <content type="html">
      <![CDATA[<p>Bueno, después de bastante tiempo sin actualizar voy a ver si vuelvo a retomar el tema del blog. Últimamente han cambiado muchas cosas, tanto en el aspecto laboral/escolar como en el personal(eso sí, todas para bien), así que espero volver a darle caña al tema de Rails que lo tenía bastante abandonado. Me acaban de llegar de Amazon los libros <a href="http://www.mypearsonstore.com/title/0672328844">The Ruby Way</a>, <a href="http://www.mypearsonstore.com/title/0321445619">The Rails Way</a>(que ya había catado en su versión en pdf y me pareció muy bueno) y <a href="http://www.mypearsonstore.com/bookstore/product.asp?isbn=0130676349">Agile Software Development with Scrum</a>, así que ahora toca <a href="http://es.wikipedia.org/wiki/Procrastinaci%C3%B3n">procrastinar</a> a tope :)<br />
    <br />
    <br />
    <br />
    <br /></p>]]>
    </content>
  </entry>
  <entry>
    <title>A&#241;adiendo nuevos tipos en las migraciones de Rails</title>
    <link type="text/html" rel="alternate" href="http://dagi3d.net/blog/archive/2008/1/4/anadiendo-nuevos-tipos-en-las-migraciones-de-rails"/>
    <id>http://dagi3d.net/blog/archive/2008/1/4/anadiendo-nuevos-tipos-en-las-migraciones-de-rails</id>
    <published>2008-01-04T00:50:12Z</published>
    <updated>2008-01-04T00:50:12Z</updated>
    <content type="html">
      <![CDATA[<p>
<p>En el proyecto con el que ando liado en mis r­atos libres, necesitaba añadir a varios modelos atributos que almaceneran decimales. En principio era tan simple como crear en cada migración las columnas con su tipo de dato correspondiente:</p><br />
  <pre>t.column :price, :precision =&gt; 6, :scale =&gt; 2, :default =&gt; nil<br />
</pre><br />
  <p>El caso es ­que se&nbsp; me hacía un tanto repetitivo estar añadiendo la misma línea en todas las migraciones donde me hacía falta(sé que no es para tanto, pero a veces la vagancia me puede) y además no estaba usando el estilo de los <a href="http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#M001222">nuevos atajos que trae Rails 2.0</a>, así que la solución era tan sencilla como reabrir la clase <em>ActiveRecord::ConnectionAdapters::TableDefinition</em>(bendito Ruby) y crear el método necesario:</p>
</p>
<pre>class ActiveRecord::ConnectionAdapters::TableDefinition

def currency(*columns)
columns.each do |column|
self.column column, :decimal, :precision =&gt; 6, :scale =&gt; 2, :default =&gt; nil
end
end

<p>end­<br />
</pre><br />
­<br />
  <br />
  <br />
  <br />
  <br />
  <br />
  <br />
  <br />
  <br />
  <br />
  <br />
  <br />
  <br />
  <p>Y ya podía usar en todas mis migraciones el método t.price teniendo que indicar únicamente el nombre de la columna(o columnas) que quería crear:<br />
    <br />
    <br />
    <br />
    <br />
    <br />
    <br /></p><br />
  <pre>class CreateLineItems &lt; ActiveRecord::Migration<br />
  def self.up<br />
    create_table :line_items do |t|<br />
      t.references :order<br />
      t.references :item, :polymorphic =&gt; true<br />
      <strong>t.currency :price</strong><br />
      t.timestamps<br />
    end<br />
  end</p>
def self.down
drop_table :line_items
end
<p>end<br />
</pre></p>]]>
    </content>
  </entry>
</feed>
