2011-01-14 3 views
1

Wir erstellen ein Rails-CMS, auf dem ein Blog oder eine Nachrichtenliste an einer beliebigen Stelle in der Site-Struktur angezeigt werden kann. Dies bedeutet, dass jede Seite ihren Typ basierend auf einem Datenbankfeld kennt - zB: Eine Seite weiß, dass sie vom Typ "Newslist" ist. Sobald die URL für diese Seite aufgerufen wird, muss sie vom Newslistingcontroller verarbeitet werden. Die Unterseiten der Newslist-Seite sind Nachrichtengeschichten - jeweils mit einem Datum und einer Kategorie.Wie identifizieren wir Parameter in einer dynamischen URL?

Die URL zum newslisting könnte

/dogs/snoopy-news/ 

und eine Nachrichtengeschichte könnte

/dogs/snoopy-news/snoopy-is-great/ 

Die Komplexität für uns mit URLs sein, die für die Auflistung Datumsbereiche von Nachrichten in zusätzlichen Parameter haben oder Kategorieneinträge zB:

Alle november news stories

auflisten 0
/dogs/snoopy-news/2010/11/ 

oder alle Geschichten aufgeführt sind, die Nahrung als ihre Kategorie haben:

/dogs/snoopy-news/category/food/ 

Da die newslisting Seite auf jeder Ebene in der Websitehierarchie sein könnte, wie wir, dass 2010 ein Parameter oder die Kategorie nähern identifizieren würde, ist ein Parameter?

(Wir speichern alle URLs in der Datenbank für jede Seite so können wir erst zu sehen, Nachschlagen, wenn eine Seite für eine URL existiert)

EDIT: Dieser Beitrag eine mögliche Lösung gibt: Dynamic CMS like routes in ruby on rails, die wir heraus versuchen und melde dich zurück. Auf Speichern einer Seite im CMS wir Routen zur Routing-Tabelle an dieser Stelle nicht nur für die Seite selbst, sondern auch für mögliche Parameter hinzufügen würden:

/dogs/snoopy-news/{year}/{month}/ 

Antwort

2

Sie können die Verwendung von Routebubbing und Constraints verwenden, um ein passendes Muster zu finden.

# Rails 2.x 
map.connect "*path/:year/:month", 
      :constraints => {:year => /\d{4}/, :month => /0[1-9]|1[0-2]/ }, 
      :controller => :pages, :action => :month_archive 

# Rails 3.x 
match "*path/:year/:month" => "pages#month_archive", 
      :constraints => {:year => /\d{4}/, :month => /0[1-9]|1[0-2]/ } 

Dies wird /dogs/snoopy-news/2010/11 entsprechen und :path => "dogs/snoopy-news", :year => "2010", :month => "11" im params-Hash übergeben. Es passt alle Routen an, die ein Jahr und einen Monat als die letzten zwei Segmente haben, unabhängig davon, wie viele Segmente vorher kommen. Und es wird jede Route ablehnen, die in den letzten beiden Segmenten nicht mit einem richtigen Jahr und einem richtigen Monat übereinstimmt. Was Sie mit dem Parameter :path machen, liegt bei Ihnen im Controller.

+0

Vielen Dank das sieht vielversprechend aus - wir werden es ausprobieren – petenelson

1

können Sie konfigurieren dieses Problem in Ihrer routes.rb Datei.

Sie eine Route wie

 map.connect 'snoopy-news/:year/:date', :controller => 'needed controller', :action => 'needed action'

Dies wird Route jede URL des Formats

 ../snoopy-news/2010/23
an den entsprechenden Controller und die Aktion mit den eingestellten Werten in den varialbles hinzufügen
 year , date

Wenn Sie geben etwas nicht, wird RAILS Betrachte dies als einen Parameter.

+0

Danke für die Antwort, aber dies wird nicht funktionieren, weil/snoopy-news/eine dynamische Seite in der Website ist und auf jeder Ebene in der Hierarchie angezeigt werden könnte. Wenn der Benutzer diese Seite in den cms bearbeitet und sie/snoopy-special-news aufruft, wird dies nicht funktionieren. Die einzige mögliche Lösung, die ich mir vorstellen kann (und nicht umsetzen kann), ist, wenn diese Seite gespeichert wird, eine Route dynamisch zu speichern, um dies zu erreichen. Würde das funktionieren oder ist es ein besserer, einfacherer Ansatz? – petenelson

+0

Möglicherweise können Sie die URL 'dynamische URL' in einer Standardaktion erhalten. Holen Sie sich die Parameter und verwenden Sie einen Vergleich, um dynamisch die URL wird helfen? bin nicht ganz sicher mit dieser Idee. Da Sie sagen, dass die Seite vollständig dynamisch ist, können wir keine statische Route erstellen. – CHID

+0

Speichern der Route wird auf der teuren Seite – CHID