2012-05-19 7 views
7

Ich kenne viele Rails Entwickler sagen, dass das Verschachteln Ihrer Ressourcen mehr als 2 Ebenen tief ist Fehlverhalten. Ich stimme auch zu, weil es unordentlich wird, wenn deine URLs wie mysite.com/account/1/people/1/notes/1 aussehen. Ich versuche, eine Möglichkeit zu finden, verschachtelte Ressourcen zu verwenden, aber ohne sie in 3 Ebenen zu verschachteln.Rails 3 Level tief geschachtelte Ressourcen

Dies ist der falsche Weg, da Rails-Entwickler es nicht empfehlen und es ist auch sehr schwierig herauszufinden, wie man dies in der Controller- oder Formularansicht verschachtelt.

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

Der richtige Weg Schienen Entwickler sagen, dass dies getan werden sollte, wie so ist

resources :account do 
    resources :people 
end 

resources :people do 
    resources :notes 
end 

Hier ist das Problem, dass ich immer den Weg laufen. Wann auch immer ich Konto/1/Leute besuche, kann ich eine Person zum Konto hinzufügen und lässt sagen, dass die URL wie mysite.com/account/1/people/1 ist und das funktioniert gut.

Nun, wenn ich versuche, die mysite.com/people/1/notes zuzugreifen Konto 1 I den Fehler

kann nicht Menschen ohne und Konto-ID

finden Wie kann Soll das funktionieren?

Antwort

10

Sie nisten die Routen so tief wie Sie als Schienen 3.x können Sie sie mit flachen abzuflachen: true

Experimentieren mit

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

Verwenden Rake Routen, um zu sehen, was man bekommt:)

UPDATE in Reaktion

Kommentar Wie gesagt, mit Rechen Routen spielen, was zu sehen, u rl die Sie bekommen können

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

Sie diese Routen können

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

Wie ersichtlich wird, haben Sie Zugriff auf alle Modelle auf welcher Ebene auch immer Sie sich entscheiden, was Sie brauchen. Der Rest hängt davon ab, was Sie in Ihre Controller-Aktionen investieren.

Sie müssen wirklich an den Aktionen arbeiten, um sicherzustellen, dass Sie geeignete Maßnahmen ergreifen, wenn ID-Parameter nicht übergeben werden. Wenn Sie also eine ID für ein bestimmtes Modell verwenden, überprüfen Sie, ob die ID in der Liste params steht wenn nicht alternative Maßnahmen ergreifen. z.B. Wenn Sie die Kontonummer nicht eingeben, stellen Sie sicher, dass Sie nicht versuchen, sie zu verwenden

Ihr Kommentar besagt, dass Sie bereits flache Routen verwenden, aber das ist nicht, was Sie in Ihrer Frage geschrieben?

+0

Ich habe derzeit flach wahr in meiner Routen-Datei bin einfach nicht sicher, wie ich auf Personen/Notizen ohne die Konto-ID zugreifen kann. Rails wirft diesen Fehler "Konnte Konto ohne ID nicht finden" – Yooku

+0

Ich habe die Antwort aktualisiert. Hoffnung, die Dinge klarstellt – jamesc

Verwandte Themen