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

Antwort per Email an