Hi,
nachdem ich jetzt eine Weile rumgesucht habe und so ziemlich jeden
mit meinem Problem auf den Wecker gefallen bin, hab ich jetzt
zumindest schon mal ein halbe Lösung für nested Resources mit
acts_as_tree:
Hier noch mal das Problem: Ich habe folgende Struktur
Project -> Container -> Container -> ....->Container->Summary, Links,
Quiz, Deck, usw.
und ich hätte eigenlich gerne dazu die entsprechenden URLs gehabt, also
/projects/<my project>/containers/<my container>/children/<child of
my container>/children/<child of child>/summaries/1
Aber das scheitert daran, dass man einen solchen dynamischen Pfad in
routes.rb gar nicht mappen kann.
Was aber funktioniert, ist das hochrutschen des jeweils aktuellen
Containers mit dem folgenden Mapping:
map.resources :projects do |projects|
projects.resources :containers do |containers|
containers.resources :summaries
containers.resources :children
end
end
Was dann zu "schönen" URLs führt wie
http://localhost:3000/projects/myproject/containers/mycontainer/
children/7
und
http://localhost:3000/projects/myproject/containers/mycontainer/
summaries/1
Etwas unschön daran, ist das man zwei Controller (für children und
für root-container bekommt) - da ist schon ein bisschen (D)RY dabei,
aber das refactoring ist nicht ganz einfach, weil child-container mit
ihren parents verdrahtet werden müssen und root-Container nicht...
Aber zumindest funktionierts: Man kann Container beliebig nesten, und
wenn man weitere Ressourcen anhängen will, dann lässt man den
Container einfach nach oben rutschen und benutzt den Pfad:
summary_url(@summary.container.project, @summary.container, @summary)
dafür, der für jeden Container gleich funktioniert, egal ob er jetzt
root oder child ist.
Womit wir aber dann endlich bei meiner Frage wären: Der Pfad selbst
ist nämlich ganz bestimmt nicht DRY:
summary_url(@summary.container.project, @summary.container, @summary)
und solche _url kommen an vielen Stellen vor. Wenn mir da also
plötzlich einfällt, dass ich da noch mal eine Ebene einschieben will,
dann ändere ich ziemlich viele Stellen. Ich such also nach einem
nützlichen Konstrukt, um diese Hierarchie
@project->@container->@summary
irgendwo zu wiederverwendbar zu hinterlegen und daraus _url's zu
generieren.
Vielleicht fällt ja noch jemandem was schlaues dazu eine und jemand
hat eine besser Idee, wie man sowas abbilden kann, ich bin da für
jede Anregung dankbar.
Viele Grüße
Stefan
PS: Den Context für diese Calls stell ich in einem :before_filter
wieder her:
before_filter :login_from_cookie, :init_context
def init_context
@project = Project.find_by_permalink(params[:project_id])
@project ||= Project.find(params[:project_id])
unless :project_id == nil # GET/project/id/
@container = Container.find_by_permalink(params[:container_id])
@container ||= Container.find(params[:container_id])
unless :container_id == nil # GET/project/id/containers/id
end
Es gibt also eine Menge Stellen, an denen diese hierarchischen
Beziehungen auftauchen - aber irgendwie fehlt mir da der Kick, um das
nützlich zusammen zu fassen...
PPS: Es wird mir immer klarer. das das vielleicht nicht die
schlaueste Idee war, mit diesen Anforderungen in mein erstes Rails-
Projekt zu gehen - aber diese ganze REST-Geschichte ist einer der
Hauptgründe für den Umstieg von jee auf rails gewesen. Daher sind
sicher einige der Ansätze hier sehr-sehr krude, ich bin da für jeden
Hinweis dankbar...
_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug