2008-10-02 8 views
11

Premisa: Normalmente, durante la preparación de una nueva aplicación Ruby on Rails, saco modelos y relaciones con respecto a las navegaciones de usuario. Usualmente llego a un lugar donde tengo que preguntarme, si debo o no ir más allá de la "regla de oro" habitual de anidar no más de 1 nivel de profundidad. A veces siento la necesidad de anidar, en lugar de crear otra ruta de espacio de nombres y duplicar el trabajo.
He aquí un ejemplo:
¿Anidar o no anidar?

modelos: usuario, ubicación, ubicación
usuario tiene y pertenece a muchas empresas (muchos a muchos)
usuario tiene y pertenece a muchos lugares (muchos a muchos)
compañía tiene y pertenece a muchos lugares (muchos a muchos)

Rutas:
1 nivel de anidamiento
usuarios /: user_id/empresas/- lista de todas las empresas relacionadas a un usuario
usuarios /: user_id/lugares/- lista de todos los lugares relacionados con un usuario
más de 1 nivel de anidamiento
usuarios /: user_id/companies /: company_id/locations/- enumera todas las ubicaciones de la empresa de un usuario

Entonces, ¿mi pregunta es si es apropiado o no anidar más de 1 nivel de profundidad en RoR? ¿Si o no? ¿Y por qué?

Respuesta

7

Tiendo a seguir Jamis Buck's advice y nunca anida más de un nivel de profundidad.

Editar: Si va a anidar más de 1 nivel Me echa un vistazo a la nueva característica shallow routes en Edge

+0

Rutas superficiales FTW. Eso es casi seguro lo que quieres. El índice de LocationsController no tiene sentido como/locations, porque nunca querrás/all/the locations.Pero le permite mantener todas las ubicaciones en/locations/ sin importar con qué tipo esté asociado. – Otto

2
users/:user_id/companies/:company_id/locations/ 

Aunque técnicamente esto está muy bien, no sería el ayudante ruta denominada por tanto

user_company_location_path(user_id, company_id, location_id) 

teniendo que carro redondo 3 parámetros como ese es molesto. Cualquier cosa molesta es probablemente una bandera roja.

+0

echa un vistazo a smart_url en resource_controller: smart_url (@user, @company, @location). Pero sí, anidar demasiado profundo parece estar mal. – webmat

1

Mientras que suena bien en teoría, he encontrado que anidan más de un nivel puede comenzar a ser confuso - especialmente si tiene el mismo controlador llamado a diferentes niveles (que puede ser bastante común)

Ej

user/x/blog/y/profile/z, and 
    user/x/profile/a 

menudo voy a encontrar que estoy trabajando en un espacio de nombres diferente a lo que creo que estoy trabajando. Si lo hacen, pero las cosas similares diferentes, puede llegar a ser muy confuso =)

Mi la aplicación actual, pasé la semana pasada y eliminé la mayoría de rutas anidadas (Por supuesto, YMMV)

Cuestiones relacionadas