2012-05-19 24 views
7

Sé que muchos desarrolladores de rails dicen que anidar sus recursos más de 2 niveles de profundidad es incorrecto. También estoy de acuerdo porque se complica cuando tus URL se parecen a mysite.com/account/1/people/1/notes/1. Estoy tratando de encontrar una forma de usar recursos anidados pero sin anidarlos a 3 niveles de profundidad.Rails Recursos anidados profundos de 3 niveles

Esta es la forma incorrecta de hacerlo, ya que los desarrolladores de rieles no lo recomiendan y también es muy difícil averiguar cómo anidar esto en el controlador o la vista de formulario.

resources :account do 
    resources :people do 
    resources :notes 
    end 
end 

La forma correcta carriles desarrollador decir esto que se debe hacer es como tan

resources :account do 
    resources :people 
end 

resources :people do 
    resources :notes 
end 

Aquí está el problema que siempre me encuentro. Cada vez que visito mi cuenta/1/personas puedo agregar una persona a la cuenta y digamos que la URL es como mysite.com/account/1/people/1 y eso funciona bien.

Ahora bien, si intento acceder a los mysite.com/people/1/notes de la cuenta 1 me sale el error

No encontraste personas sin e ID de cuenta

¿Cómo puede hacer que esto funcione correctamente?

Respuesta

10

Usted nido de las rutas tan profundo como te gusta como carriles 3.x le permite acoplar usando poco profunda: la verdadera

Trate de experimentar con

resources :account, shallow: true do 
    resources :people do 
    resources :notes 
    end 
end 

rutas uso del rastrillo para ver lo que se obtiene:)

ACTUALIZACIÓN en respuesta al comentario

Como ya he dicho, jugar con rutas rastrillo para ver qué u RL puede obtener

resources :account, shallow: true do 
    resources :people, shallow: true do 
    resources :notes 
    end 
end 

le consigue estas rutas

:~/Development/rails/routing_test$ rake routes 
     person_notes GET /people/:person_id/notes(.:format)  notes#index 
        POST /people/:person_id/notes(.:format)  notes#create 
    new_person_note GET /people/:person_id/notes/new(.:format) notes#new 
     edit_note GET /notes/:id/edit(.:format)     notes#edit 
       note GET /notes/:id(.:format)      notes#show 
        PUT /notes/:id(.:format)      notes#update 
        DELETE /notes/:id(.:format)      notes#destroy 
    account_people GET /account/:account_id/people(.:format)  people#index 
        POST /account/:account_id/people(.:format)  people#create 
new_account_person GET /account/:account_id/people/new(.:format) people#new 
     edit_person GET /people/:id/edit(.:format)    people#edit 
      person GET /people/:id(.:format)      people#show 
        PUT /people/:id(.:format)      people#update 
        DELETE /people/:id(.:format)      people#destroy 
    account_index GET /account(.:format)      account#index 
        POST /account(.:format)      account#create 
     new_account GET /account/new(.:format)     account#new 
     edit_account GET /account/:id/edit(.:format)    account#edit 
      account GET /account/:id(.:format)     account#show 
        PUT /account/:id(.:format)     account#update 
        DELETE /account/:id(.:format)     account#destroy 

Como puede verse, se tiene acceso a todos los modelos en cualquier nivel que usted decide que necesita. El resto depende de lo que pongas en tus acciones de controlador.

Realmente tiene que trabajar en las acciones para asegurarse de tomar las medidas adecuadas cuando los parametros no se pasan, así que si usa una identificación para un modelo específico, verifique que la identificación esté en la lista de params y si no, tome una acción alternativa. p.ej. Si no pasa la identificación de la cuenta, asegúrese de no intentar usarla

su comentario indica que ya usa rutas superficiales, pero eso no es lo que publicó en su pregunta?

+0

Actualmente tengo una verdad superficial en mi archivo de rutas, pero no estoy seguro de cómo puedo acceder a personas/notas sin la identificación de la cuenta. Rails está lanzando este error 'No se pudo encontrar la cuenta sin una ID' – Yooku

+0

He actualizado la respuesta. Espero que aclare las cosas – jamesc

Cuestiones relacionadas