Digamos que mi aplicación tiene dos modelos, Foo y Bar.Rails Espacio de nombres frente a recurso anidado
Foo opcionalmente pertenece a Bar.
Ahora puedo mirar un solo Foo, o buscar un Foo en particular, y el FoosController maneja todo eso. Mis URL son como: foos/1
y foos/new
A veces quiero ver un bar. BarsController maneja eso, y lo hago como: bars/1
o bars/1/edit
.
Si estoy buscando un Bar, es posible que desee explorar todos los Foos que forman parte de ese Bar. Entonces, me gustaría usar bars/1/foos/
para mirar esos Foos.
Esto es muy sencillo con recursos anidados, y se ve así:
resources :foo
resources :bar do
resources :foo
end
Sin embargo, Foos que son parte de una barra son un poco especial, apartado de los Foos regular. Entonces, por ejemplo, si cargo foos/1
o bars/1/foos/1
, estaría buscando el mismo Foo, pero estoy enfocado en información diferente en cada caso.
Así que he estado pensando en tener un Controlador BarFoos para manejar Foos cuando están en el contexto de un Bar. Sin embargo, si anoto BarFoos en Bar, mis ayudantes serán como bar_bar_foos_path
y new_bar_bar_foo_path
. Eso parece redundante.
Por lo tanto, ahora estoy pensando en espacios de nombres, que es algo que nunca antes había visto. Veo en los carriles de guía que podría definir:
namespace "bar" do
resources :foos
end
Si hago lo que puedo hacer una segunda FoosController
bajo app/bar/
, y que FoosController puedo manejar Foos en el interior de un bar con buenos ayudantes como bar_foo_path(:id)
en lugar de bar_bar_foo_path(:id)
.
Pero si hago eso, ¿qué ocurre con mi BarsController
? ¿Cómo se enrutan las solicitudes al BarsController
si en lugar de resources :bars
tengo namespace "bar"
?
Y, por último, ¿hay algo especial que deba hacer dentro de mi FoosController secundario para asegurarme de que no haya un conflicto de nombre con el FoosController de nivel superior? Me doy cuenta de que el enrutamiento dice "espacio de nombres", pero ¿cómo sabe el resto del código de rubí que el app/bar/foos_controller
y el app/foos_controller
no son de la misma clase?
Gracias!
Su descripción de mi escenario es exactamente correcto , y tu respuesta es muy clara, ¡gracias! Veo cómo funcionaría tu respuesta, ¡eso es increíble! Solo para dar seguimiento a un detalle, ¿* recomendarías * anidar sobre el espacio de nombres en este escenario? ¿Podrías ofrecer cualquier pros/contra que hayas experimentado en ambos sentidos? – Andrew
En su caso, como bar y foo son ambos recursos, y foo pertenece a la barra, tiene mucho sentido usar recursos anidados. Para ampliar la explicación del espacio de nombres anterior: si se encuentra en una situación en la que se trata de diferentes comportamientos para diferentes contextos, es decir, si soy administrador, hago A, de lo contrario hago B, y la lógica es cualquier cosa menos la lo más simple o disperso, consideraré el espacio de nombres y agregaré un controlador que me permita trabajar en ese contexto específico. 'admin' representa un contexto en lugar de un recurso en este caso. – clemensp
Genial, ¡eso tiene mucho sentido! – Andrew