Forum: Rails-ES Mejorar/resumir "routes.rb"

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Daniel L. (Guest)
on 2009-02-10 13:54
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. :)
Isaac Feliu Pérez (Guest)
on 2009-02-10 14:00
(Received via mailing list)
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
Emili P. (Guest)
on 2009-02-10 14:05
(Received via mailing list)
A parte del screencast que te recomienda Issac, creo que necesitas
echarle
un vistazo al tema de las rutas.
http://api.rubyonrails.org/classes/ActionControlle...


2009/2/10 Isaac Feliu Pérez <removed_email_address@domain.invalid>
Raul M. (Guest)
on 2009-02-10 14:16
(Received via mailing list)
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/ActionControlle...

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.
Daniel L. (Guest)
on 2009-02-10 17:08
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. :P

¡Gracias de nuevo! :D
Daniel L. (Guest)
on 2009-02-11 12:56
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. :)
This topic is locked and can not be replied to.