Acabo de encontrarme con un error bien extraño al hacer deployment de una aplicación rails al ambiente de producción.

El error era que las rutas del recurso se estaban generando mal, mi recurso se llama operadores y la entrada en el config/routes.rb era esta:

map.resources :operadores  do |operador|
  operador.resources :llamadas,
                     :name_prefix => "operador_",
                     :collection => {:exitosas => :get}

con lo cual rails me pone a disposición el siguiente helper para acceder a las llamadas exitosas de un operador:

operador_exitosas_llamadas_path(mi_operador)

En desarrollo todo funcionaba bien, pero al probar en producción, rails tomaba el url:

http://miservidor/operadores/33/llamadas;exitosas

e interpretaba los parámetros como:

{:controller => "llamadas", :action => "exitosas", :operadore_id => "33"}

Notese el :operadore_id (con la 'e' de más) cuando en mi aplicación esperaba que el parámetro fuese :operador_id (en el singular adecuado del español). Esto ocurría a pesar que las reglas de inflección para el español están bien definidas, es decir en el config/environment.rb tengo:

Inflector.inflections do |i|
   # todas las terminadas en l n d r
   i.plural /^(.*)([lrnd])$/i, '\1\2es'
   i.singular /^(.*)([lrnd])es$/i, '\1\2'
   i.irregular 'session', 'sessions' #Esto es para el manejo de sesiones en la BD
end

El problema parece ser que en producción el routes se carga primero que el inflector, con lo cual rails no aplica el inflector definido en el config/environment.rb para los routes.

La solución es utilizar el parámetro :singular en la declaración del recurso en el routes.rb:

map.resources :operadores, :singular => :operador do |operador|
  operador.resources :llamadas,
                     :name_prefix => "operador_",
                     :collection => {:exitosas => :get}
end


4 Respuestas a “Rails - Recursos, rutas y el inflector”

  1. 1 Emmanuel Oga

    Ah!!! Por eso, siempre uso nombres en ingles para mis controllers, models y demas.

    Aprovecho para darle las gracias a Anibal por su comentario en mi blog sobre la task de rails para dibujar rutas. Si interesa, he aqui una modificacion para que se vea mas linda la salida de rake:routes_page (genera salida en /docs/routes.html)

    http://pastie.caboo.se/96880

    Saludos!

  2. 2 EmmanuelOga

    algo mas!

    http://www.programmingishard.com/code/461 sugiere hacer

    ActionController::Routing::Routes.reload

    luego de agregar rutas nuevas

  3. 3 Markús

    Yo he tenido el mismo problema, teniendo que utilizar :singular en un par de rutas que me daban problemas.

    Aún así esto no es un comportamiento normal y se ha corregido en Rail 2 http://dev.rubyonrails.org/changeset/7849, que viene siendo lo mismo haciendo lo mismo que dice EmmanuelOga pero de forma automática

  4. 4 William Betancur

    Mil Gracias, con este articulo solucione un gran problema.

    saludos desde Colombia

Añade un Comentario





RSS feeds

Suscríbete a nuestros RSS Feeds