2010-04-10 11 views
6

Tengo un poco de dificultad para encontrar la respuesta correcta a esto, por lo que solicitaré mi problema aquí. Estoy trabajando en una API RESTFul. Naturalmente, tengo múltiples recursos, algunos de los cuales consisten en relaciones de padres a hijos, algunos de los cuales son recursos independientes. Donde estoy teniendo un poco de dificultad es encontrar la manera de facilitar las cosas para las personas que construirán clientes contra mi API.Asignación de recursos en una URL de Ruby on Rails (API RESTful)

La situación es esta. Hipotéticamente, tengo un recurso de 'Calle'. Cada calle tiene múltiples hogares. So Street: has_many to Homes and Homes: belongs_to Street. Si un usuario desea solicitar un HTTP GET en un recurso específico a casa, el siguiente debería funcionar:

http://mymap/streets/5/homes/10

que permite a un usuario obtener información de un hogar con el identificador 10. sencillo. Mi pregunta es, ¿estoy rompiendo las reglas del libro, dando al usuario el acceso a:

http://mymap/homes/10

Técnicamente existe ese recurso local en su propia sin la calle. Hace sentido que existe como su propia entidad sin una calle de encapsulado, aunque la lógica de negocios dice lo contrario.

¿Cuál es la mejor manera de manejar esto?

EDIT! En mi afán por convertirme en un buen ciudadano de StackOverflow, he vuelto con un bloque de código compatible para saber cómo implementarlo más arriba.

map.resources :streets, 
       :has_many => :homes 
       :shallow => true 

Esto creará dos tipos de rutas que yo estaba buscando.

+0

Esa opción superficial es interesante. – tadman

Respuesta

5

Si los registros de su hogar solo pueden pertenecer a una calle, entonces la relación no se confundirá cuando examine una casa individualmente. Aún podrá realizar un seguimiento retroactivo del registro Street asociado por el motivo que sea.

Es en situaciones en las que tiene una relación de varios a muchos que desanudar su estructura REST puede ocasionarle problemas. Si un registro en particular solo tiene sentido en un contexto particular, y elimina ese contexto, obviamente hay confusión.

Creo que en su caso particular puede que no necesite implementar ambos enfoques, sino que adopte el enfoque "más plano" que reduce la complejidad de la URL.

+3

Si _describe_ ambas opciones, querrá asegurarse de usar 'rel =" canonical "' en una de ellas para vincularlas a la otra. (Probablemente vincule _desde_ la versión más profunda _a_ la menos profunda). –

0

No, así es como funcionan las rutas superficiales y se usan mucho.

0

Me gusta mucho el enfoque this. Recomiendo leerlo En resumen, este artículo dice que no debe anidar sus recursos más de 1 nivel. Y si es posible que el recurso anidado pueda ser minimizado, entonces hágalo.

En una de mis aplicaciones realmente arruiné las cosas con los recursos anidados. Voy incluso a 3 o 4 de profundidad y se convierte en una pesadilla ...

Anidar es realmente bueno si hace las cosas más simples. Si no, ¡desiste!