Mejorar/resumir "routes.rb"


#1

Hola a todos,

Acabo de desarrollar mi primera aplicación basada en Rails, pero tengo
la sensación (prácticamente la certeza :P) de que podría mejorarla
muuucho, empezando por el archivo de rutas. Ahora mismo es una ristra de
código repetitivo, lo cual incumple mil conceptos de la filosofía RoR,
pero soy incapaz de cambiarlo sin que nada casque.

Os dejo un fragmento del mismo:


ActionController::Routing::Routes.draw do |map|
map.root :controller => “home”

map.tails__queue__select_by_telefono
“tails/queue/select-by-telefono/:telefono/:format”,
:controller => “tails/queue”,
:action => “select_by_telefono”,
:params => [:telefono]
map.tails__queue__select_joins_by_ope_cli_and_acdv_order_by_id
“tails/queue/select-joins-by-ope-cli-and-acdv-order-by-id/:cli_id_fk/:acdv/:format”,
:controller => “tails/queue”,
:action => “select_joins_by_ope_cli_and_acdv_order_by_id”,
:params => [:ope_id_fk, :cli_id_fk, :acdv]

map.tails__queue_member__select_join_by_queue
“tails/queue-member/select-join-by-queue/:queue_id_fk/:format”,
:controller => “tails/queue_member”,
:action => “select_join_by_queue”,
:params => [:queue_id_fk]
map.tails__queue_member__select_join_by_queue_and_disconnected
“tails/queue-member/select-join-by-queue-and-disconnected/:queue_id_fk/:disconnected/:format”,
:controller => “tails/queue_member”,
:action => “select_join_by_queue_and_disconnected”,
:params => [:queue_id_fk, :disconnected]

map.voz__voz_grupos_acd__insert_sgr_queue
“voz/voz-grupos-acd/insert-sgr-queue/:sgr_id_fk/:queue_id_fk/:format”,
:controller => “voz/voz_grupos_acd”,
:action => “insert_sgr_queue”,
:params => [:sgr_id_fk, :queue_id_fk]
map.voz__voz_grupos_acd__delete_by_sgr
“voz/voz-grupos-acd/delete-by-sgr/:sgr_id_fk/:format”,
:controller => “voz/voz_grupos_acd”,
:action => “delete_by_sgr”,
:params => [:sgr_id_fk]

map.voz__voz_operadores__select_horario_by_id
“voz/voz-operadores/select-horario-by-id/:ope_id/:format”,
:controller => “voz/voz_operadores”,
:action => “select_horario_by_id”,
:params => [:ope_id]
map.voz__voz_operadores__update_by_ope
“voz/voz-operadores/update-by-ope/:ope_nombre/:ope_telefono/:ope_forzar_remitente/:ope_id/:format”,
:controller => “voz/voz_operadores”,
:action => “update_by_ope”,
:params => [:ope_nombre, :ope_telefono, :ope_forzar_remitente,
:ope_id]
end


Como véis, todos tienen el “/:format” al final, varios de ellos
comparten controller (en cuyo caso, se refleja en la URL, sustituyendo
los guiones bajos por los normales), etc…
Entiendo que todo esto se puede resumir muchísimo pero, como os decía,
no tengo los conocimientos suficientes para hacerlo… ¿alguien puede
ayudarme?

Gracias de antemano. :slight_smile:


#2

Daniel,

al margen de los nombres de variables/parametros que utilizas que se
me antoja francamente excesivamente complejo y críptico, lo que si
puedes hacer de forma sencilla es utilizar with_scope para eliminar
cosas duplicadas, mirate este screencast de ryan bates, que lo explica
muy clarito:

http://railscasts.com/episodes/42

Saludos,

Isaac Feliu


#3

A parte del screencast que te recomienda Issac, creo que necesitas
echarle
un vistazo al tema de las rutas.
http://api.rubyonrails.org/classes/ActionController/Routing.html

2009/2/10 Isaac Feliu Pérez removed_email_address@domain.invalid


#4

Vale, muchas gracias. He aprendido que puedo quitar :params de
routes.rb, pues se coge automáticamente en cuanto aparecen los
parámetros en la URL. También he hecho que solo se tenga que poner una
vez el controlador con “with_options”, pero se sigue repitiendo lo de
“/:format” al final de cada dirección, así como “:controller/:action/”
al principio de la misma, ¿podría reducir aún más esto?
Creo que tiene que ver con :path_prefix, pero no lo tengo del todo
claro.

Y, bueno, la verdad es que ya sabía de la existencia de los enlaces que
me habéis pasado, pero no los había leído con el detenimiento que
merecen. Os pido disculpas por ello. :stuck_out_tongue:

¡Gracias de nuevo! :smiley:


#5

2009/2/10 Emili Parreño removed_email_address@domain.invalid:

A parte del screencast que te recomienda Issac, creo que necesitas echarle
un vistazo al tema de las rutas.
http://api.rubyonrails.org/classes/ActionController/Routing.html

Otro enlace más: http://guides.rails.info/routing.html

Aprovecho para aplaudir públicamente el soberbio trabajo que
estánhaciendo con las guías oficiales de Rails, de verdad hay material muy
bueno
ahí. Además para casos como este la API puede resultar un poco
áspera y las guías que he visto hasta ahora combinan un enfoque
didáctico con una profundidad de contenido bastante mayor que la que
suelen abarcar los típicos tutoriales.


#6

Madre mía, después de mirarlo todo más detenidamente, me he dado cuenta
de que el código del principio era una jodida mierda. Me he puesto a
ello y he conseguido dejarlo en esto (haciendo algunos cambios en los
controladores):


ActionController::Routing::Routes.draw do |map|
map.root :controller => “home”

controllers = [
“tails/queue”,
“tails/queue_member”,
“tails/extensions”,
“tails/event_agent_complete”,
“tails/event_agent_connect”,
“tails/event_join”,
“tails/event_queue_caller_abandon”,
“tails/event_queue_lost”,
“voz/cvr_destinos”,
“voz/voz_horarios_fase4”,
“voz/voz_usuarios_acd”,
“voz/voz_grupos_acd”,
“voz/voz_operadores”,
“voz/voz_operadores_servicios”,
“voz/voz_servicios_grupos”,
“voz/voz_usuarios”
]
controllers.each do |controller|
tabla_controller = controller.split("/")[1]
map.with_options :controller => controller do |tabla_controller|
tabla_controller.connect controller + “/:action/:param1/:format”
tabla_controller.connect controller +
“/:action/:param1/:param2/:format”
tabla_controller.connect controller +
“/:action/:param1/:param2/:param3/:format”
tabla_controller.connect controller +
“/:action/:param1/:param2/:param3/:param4/:format”
end
end

end


Como os dije, lo que puse era sólo un fragmento del total, por lo que la
mejora es aún mayor de lo que parece.

De todas maneras, se sigue repitiendo el “/:format” al final de cada
mapeo, ¿no hay ninguna manera de ponerlo sólo una vez y que valga para
todas?

Además, he metido todos los controladores en un array y tal por que al
estar en subcarpetas, si lo ponía directamente como :controller en la
URL no me lo detectaba (debido al slash del medio), ¿es esto lo correcto
o hay alguna forma mejor?

Un saludo, y gracias de antemano. :slight_smile: