2012-05-19 19 views
7

So che molti sviluppatori di rotaie sostengono che annidare le proprie risorse più di 2 livelli in profondità è un errore. Sono anche d'accordo perché diventa disordinato quando le tue url sono come mysite.com/account/1/people/1/notes/1. Sto cercando di trovare un modo per utilizzare le risorse annidate, ma senza annidarle a 3 livelli di profondità.Rails 3 risorse nidificate a livello profondo

Questo è il modo sbagliato di farlo poiché gli sviluppatori di rails non lo consigliano ed inoltre è molto difficile capire come nidificarlo nella vista del controller o del modulo.

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

Il modo corretto rotaie sviluppatori dicono che questo dovrebbe essere fatto è come così

resources :account do 
    resources :people 
end 

resources :people do 
    resources :notes 
end 

Ecco il problema che ho sempre incontrato. Quando mai visito account/1/persone posso aggiungere una persona all'account e diciamo che l'url è simile a mysite.com/account/1/people/1 e che funziona bene.

Ora, se provo ad accedere alle mysite.com/people/1/notes dal conto 1 ho l'errore

Non riesci a trovare le persone senza conto e id

Come può ottenere questo per funzionare correttamente?

risposta

10

È nido i percorsi profondi come ti piace come rotaie 3.x consente di appiattire utilizzando superficiale: vero

Prova a sperimentare con

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

percorsi Usa rake per vedere quello che si ottiene:)

UPDATE in risposta al commento

Come ho detto, giocare con percorsi rake per vedere cosa u rl di è possibile ottenere

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

si ottiene questi itinerari

:~/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 

Come si può vedere, si ha accesso a tutti i modelli a qualunque livello si decide hai bisogno. Il resto dipende da tutto ciò che hai inserito nelle azioni del tuo controller.

Devi davvero lavorare sulle azioni per assicurarti di prendere le misure appropriate quando i parametri ID non vengono passati, quindi se usi un id per un modello specifico controlla che l'id sia nella lista params e se non prendere l'azione alternativa. per esempio. se non si passa l'ID dell'account in poi assicurati di non provare ad usarlo

il tuo commento afferma che usi già percorsi poco profondi, ma non è quello che hai postato nella tua domanda?

+0

Al momento non sono a conoscenza dei miei percorsi, non so come posso accedere a persone/note senza l'ID dell'account. Rails lancia questo errore 'Impossibile trovare l'account senza ID' – Yooku

+0

Ho aggiornato la risposta. Spero che chiarisca le cose – jamesc

Problemi correlati