Rails - Recursos, rutas y el inflector
Publicado por Edgar González 11 Septiembre 2007 en Ruby, Rails. Etiquetas: 2007, infleccion, inflector, plural, Rails, recurso, recursos, resource, resources, routes, ruby, singular. english • españolAcabo 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:
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:
En desarrollo todo funcionaba bien, pero al probar en producción, rails tomaba el url:
e interpretaba los parámetros como:
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:
# 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:
operador.resources :llamadas,
:name_prefix => "operador_",
:collection => {:exitosas => :get}
end
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!
algo mas!
http://www.programmingishard.com/code/461 sugiere hacer
ActionController::Routing::Routes.reload
luego de agregar rutas nuevas
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
Mil Gracias, con este articulo solucione un gran problema.
saludos desde Colombia