Fixing fieldWithErrors behavior

Dealing with errors in Rails forms can be a hard task. When a form field has errors, ActionView wraps the input in a div of class “fieldWithErrors”. The result is something like this

<p><div class="fieldWithErrors"><input id="user_name" name="user[name]" type="text" value="" /></div></p>

A div inside a paragraph ?¿?¿? This behavoir can be very annoying and isn’t XHTML compliant. A simple solution is add this line at the end of environemnt.rb or in a file under lib dir:

ActionView::Base.field_error_proc = Proc.new { |html_tag, instance| "<span class=\"fieldWithErrors\">#{html_tag}</span>" }

This is the result

<p><span class="fieldWithErrors"><input id="user_name" name="user[name]" type="text" value="" /></span></p>

A single line that simplifies your life ;)

Define index lengths in your migrations

Defining an index length is a common practice in order to avoid large data indexes, and improve performance. Some time ago, I sent a patch to Rails core, which added the functionality to define index lengths in the migrations. For example:

add_index(:accounts, [:name, :surname], :name => 'by_name_surname', :limit => 10)

While I wait a decission from the Rails core members about this patch, I decided to release this functionality built-in in a plugin.

With this plugin, you can specify index lengths in your migrations easily. Here are some examples:

add_index(:accounts, :name, :limit => 10)

generates CREATE INDEX by_name ON accounts(name(10))

add_index(:accounts, [:name, :surname], :name => 'by_name_surname', :limit => 10)

generates CREATE INDEX by_name_surname ON accounts(name(10), surname(10))

add_index(:accounts, [:name, :surname], :name => 'by_name_surname', :limit => {:name => 10, :surname => 20})

generates CREATE INDEX by_name_surname ON accounts(name(10), surname(20))

You can download it from my GitHub repo github.com/eparreno/mysql_index_length/

How to import data from CSV files in Rails

CSV is commonly used to import data from an external source. You can populate your Rails applications with emails, user names, phone numbers etc. from other applications, databases, excel files…
Let me show you an example.

#users.csv
kevin, kevin@gmail.com
Jhon, jhon@gmail.com
require 'csv'
CSV.open('users.csv', 'r').each do |row|
  User.create(:username => row[0], :email => row[1])
end

The open method, opens the specified file, parses lines from given stream and returns every line in an array. The diferent fields can be accessed by row[0], row[1] etc.

If you are a Windows user you must use rb as mode. The b option is the binary file mode needed in DOS/Windows environments.

The default separator is ‘,’. You can use another separator passing it as a third parameter

CSV.open('users.csv', 'r', ';' )

More info
www.ruby-doc.org/stdlib/libdoc/csv/rdoc/classes/CSV.html

EuRuKo 2009 is over!

The European Ruby Conference is over. As a member of the organizing team, I would like to thank you for coming, and for contributing to the success of Euruko 2009.

We’ve worked hard the lasts few months to organize a successful event, and it has been fantastic to read your positive comments, and confirming that you had fun with us.

The talks have been very interesting, lightning talks as well. I learnt a bunch of new stuff that I’ll practice as soon as possible. I would like to highlight Javier Ramirez’s talk about Gosu, Aslak for your talk about Cucumber, and of course, Matz for your keynote.

You can see my photos, and here are the rest.

EuRuKo 09

See you in Kraków!!!

Manejo de excepciones en Rails

Una mala práctica habitual en Rails es no manejar correctamente las excepciones. Algunas excepciones comunes son: ActiveRecord::RecordNotFound, ActionController::RoutingError o ActionController::UnknownAction. Para poder manejar estas excepciones y realizar una acción determinada cuando se produzcan se puede utilizar el método rescue_from. Veamos un ejemplo:

class ApplicationController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found 

  private
  def record_not_found
    render :file => "#{RAILS_ROOT}/public/404.html", :status => 404
  end
end

Más información
Rails API: rescue_from
Rescue from dispatching

Cómo “humanizar” los nombres de atributos en Rails

Desde las últimas versiones de Rails, habréis observado que en los formularios se utilizan símbolos para mostrar el nombre de los atributos, por ejemplo

<%= f.label :title_spanish %>

Esto es perfecto, te ahorra mucho trabajo, pero tiene el problema de que normalmente el nombre de los atributos no es el que realmente queremos mostrar en las vistas o no está en nuestro idioma. Por ejemplo si tenemos un atributo title_spanish la etiqueta de arriba generará este código

<label for="title_spanish">Title spanish</label>

El helper label intenta “humanizar” el nombre del atributo, pero a menudo no es el resultado que nos gustaría tener.

Hay una manera elegante y muy DRY de personalizar este comportamiento, para no tener que andar modificando todas las vistas a mano.

En el directorio initializers podemos editar el archivo inflections.rb y añadir lo siguiente

ActiveSupport::Inflector.inflections do |inflect|
  inflect.human "title_spanish", "Título en castellano"
  inflect.human "created_at", "Creado el"
  ...
end

Esto también hará que en los mensajes de error de las validaciones aparezcan los nombres de los atributos como los hayamos definido nosotros y no con su nombre real. En definitiva, en cualquier lugar donde se utilice el símbolo :title_spanish se mostará como “Título en castellano”.

Podéis ver más sobre la clase Inflections en su página de la API de Rails

Euruko 2009: call for papers is now open

If you have a good idea for a Ruby related talk, we want to encourage you to make a proposal for a speech. We are looking for people willing to present on topics like:

  • Non conventional uses of Ruby
  • Interesting practices/techniques to develop Ruby code
  • Useful Ruby libraries/gems
  • Ruby programming related to other technologies/fields

And if you are too shy to propose a talk, you can still help by telling us what kind of topics you would like to see covered during the conference. Make your voice heard at the Euruko this year!

Presentation proposals should be a relatively detailed extended abstract including the topic, outline, suggested duration and details of what will be presented, and should be emailed to talks@euruko2009.org. (Ideas for topics should also be emailed to the same address.)

Sessions will be distributed in a single track covering technical sessions (20/30/45 minutes + 10 for Q&A), and lightning talks.

The call for papers finishes by February 28th and accepted proposal authors will be contacted on or before March 10th

More info
Euruko 2009 Homepage
Euruko 2009 mailing list

Resumen del 2008

Casi sin darnos cuenta, otro año más… La verdad es que el 2008 ha sido un año bastante bueno para mí a nivel profesional. He estado centrado básicamente en dos proyectos bastante largos que me han dejado tiempo para hacer alguna otra cosa pequeña, pero poco.

IKEA: www.elhogar.de

Formando parte del equipo de Profesionalia, me encargué del desarrollo y maquetación de la comunidad virtual de IKEA, elhogar.de, dirigida a aquellos que quieren subir las fotos de su casa, compartir conocimientos sobre decoración, escribir sobre sus aventuras cotidianas en su hogar…
Fué un parto largo y duro, pero creo que el resultado final valió la pena.

elhogarde

Unidiversitat: www.unidiversitat.com

El otro proyecto que me ha tenido ocupado gran parte del año ha sido Unidiversitat.
Unidiversitat es una tarjeta de crédito de La Caixa, englobada en el programa joven LKXA. Los usuarios de esta tarjeta disponían de descuentos y entradas gratis a conciertos, eventos deportivos, parques de atracciones… llamados “ventajas”. Se decidió crear una comunidad virtual, un tanto especial, para que los usuarios pudieran intercambiar las ventajas que no iban a utilizar y conseguir nuevas.

unidiv

A parte de dedicarme a estos dos proyectos, también he tenido tiempo para realizar otros más pequeños.

Treureg.eu
Joid’Art, intranet gestión de tiendas.
Mas Murtra, casa rural.
De Calaix, grupo de música tradicional catalana.
Associació Gironina d’Empresàries, intranet asociadas.

En noviembre estuve de ponente en la Conferencia Rails, dando una charla sobre Optimización de ActiveRecord.

Y entre todo esto surgió la idea, junto a otros compañeros de crear el SRUG (Spanish Ruby Users Group) y de organizar al próxima Euruko 2009 en Barcelona.

Así que como podéis ver, el año pasado fue muy productivo, espero que este año sea igual o mejor y pueda seguir disfrutando, como lo hago ahora, de mi trabajo.

Cómo medir la calidad del código

Hay muchas maneras, pero sin duda esta es una de las más efectivas:
code quality measurement

Grup Girona on Rails

Aquest matí fent un cafè amb en Jaime Iniesta hem decidit crear el grup Girona on Rails. La idea és fer reunions per parlar de Rails, Ruby, Git, Shoes, Merb… compartir experiències, aprendre i sobretot passar-ho bé.

De moment hem creat un grup a Google per concentrar la informació rel.lacionada amb el grup, així que si ets de Girona i t’agrada Rails, apunta’t!

http://groups.google.com/group/gironaonrails