4Trabes Historias de una empresa en 100 metros cuadrados

El blog de Trabe Soluciones

Rails, REST e i18n

| | Comentarios

Ahora que estamos utilizando a tope Rails 2.0 y toda la parafernalia REST en nuestras aplicaciones, nos hemos dado de bruces con un pequeño problema de rutas.

La solución pre-REST

Digamos que nuestras aplicaciones están internacionalizadas y que tenemos la costumbre de poner el código de idioma en la URL, utilizando un filtro para forzar que este código aparezca en la misma mediante una redirección. Una técnica bastante habitual y extensamente documentada.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# application.rb
before_filter :set_language

def set_language
  unless (locale = params[:locale]).blank? && Languages.supported?(locale)
    set_locale(@locale = locale)
  else
    redirect_to params.merge(:locale => Languages.default)
    return false
  end
end

# routes.rb
map.connect ':locale/:controller/:action/:id'
map.connect ':controller/:action/:id'

De este modo, la primera petición a la aplicación que no lleve el idioma en la URL recibirá como respuesta una redirección a la misma URL con el añadido del idioma.

El problema con REST

Si añadimos un recurso, las rutas generadas y los helpers para crear paths y urls no incluirán el código de idioma, por lo tanto, si no hacemos nada, al pasar por el filtro cada petición recibirá como respuesta un redirect. Mal asunto.

1
2
3
4
# routes.rb
ActionController::Routing::Routes.draw do |map|
  map.resources :customers
end

La solución

En primer lugar necesitamos modificar ligeramente las rutas para que estas incluyan el código de idioma.

1
2
3
4
5
ActionController::Routing::Routes.draw do |map|
  map.with_options(:path_prefix => ':locale') do |localized_map|
    localized_map.resources :order
  end
end

Por último debemos lidiar con la generación de rutas. Como quedaría feo (y no muy DRY) tener que andar pasando el código de idioma a cada helper (léase order_path(@current_locale, @order)) lo que necesitamos es modificar el comportamiento de Rails para que lo haga él solito. Y qué suerte la nuestra, ya existe un plugin para eso: localize_url_helpers, que de forma transparente incluye el idioma y nos permite usar los helpers como de costumbre.

C’est voila.


Lo sentimos, pero los comentarios están cerrados

Interesante plugin, voy a meterlo en mi lista de favoritos.

Hablando de internacionalización, hay un plugin muy interesante de un colega nuestro brasileño, en http://www.nomedojogo.com/custom-resource-name-plugin/, que hace que puedas darle nombres diferentes a las urls según gustes.

Quizá os viene bien para el tema internacionalización.

Un saludo.