2009-12-09 9 views
6

Ich suche etwas ähnliches ein Wordpress-Slug zu tun, wo ich eine URL wie diese unter Beibehaltung RESTful Routing haben:Schienen RESTful Routing Mit ‚/‘ und Slugs

http://foo.com/blog/2009/12/04/article-title

Der Grund, warum ich in RESTFUL Routing Behalte das Interesse am ist, dass ich nicht viele Plugins verwenden kann, weil ich benutzerdefinierte Routen verwende.

Ich habe bereits die RESTful Erscheinung abgetan:

map.connect '/blog/:year/:mon/:day/:slug', 
       :controller => 'posts', :action => 'show', 
       :year => /\d{4}/, :month => /\d{2}/, 
       :day => /\d{2}/, :slug => /.+/, 
       :requirements => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/, :slug => /.+/ }

Um die Links zu schreiben, hatte ich link_to Helfer Gewohnheit zu schreiben, die richtigen URLs zu erzeugen. Ich möchte wirklich diesen RESTful machen und den link_to post_path (@post) die obige URL und den link_to edit_post_path (@post) erzeugen lassen ... artikel-titel/bearbeiten

Ich habe auch: has_many => [: Kommentare] und ich würde das auch arbeiten. Die link_to, die ich wie folgt aussieht versucht:

'posts', :action => 'show', :year => recent_post.datetime.year.to_s, 
      :month => sprintf('%.2d', recent_post.datetime.mon.to_i), 
      :day => sprintf('%.2d', recent_post.datetime.mday.to_i), 
      :slug => recent_post.slug %> 

und ergibt dies (das ist nicht das, was ich will):

http://foo.com/posts/show?day=30&month=11&slug=welcome-to-support-skydivers&year=2009

Ich bin mir nicht sicher, was ich falsch mache. Ist das überhaupt möglich?

+0

Um genauer zu sein, versuche ich, ein Sitemap-Generator-Plugin zu verwenden, das die Routen verwendet, die durch die Karte generiert werden.Ressourcenbereich der Routen.rb. Ich versuche zu vermeiden, das Plugin zu erweitern, um vollständig benutzerdefinierte Routen zu behandeln. Ich habe bereits die Helfer geschrieben, um die Links selbst zu generieren. Ich bin gespannt, ob es möglich ist, routengenerierte URLs zu verwenden. –

Antwort

2

Ich denke, es funktioniert nicht, weil Sie keine benutzerdefinierte Route verwenden. Ich mache das die ganze Zeit. Ich habe einfach Setup eine einfache benutzerdefinierte Route:

map.present_page '/blog/:year/:month/:day/:slug', 
      :controller => 'posts', :action => 'show' 

Dann sollten Sie in der Lage zu tun:

present_page_path(:year => 2009, 
        :month => "December", 
        :day => "13", 
        :slug => "just-an-example") 

Der Grund Sie eine Abfrage-String bekommen ist sehr wahrscheinlich, weil Schienen ist die Verbindung nicht machen aus welchen Gründen auch immer. Die Verwendung einer benannten Route weist die Rails ausdrücklich an, diese Route zu verwenden. Lass es mich wissen, wenn das das für dich löst!

+0

Dies ist genau das, was ich suche. Mit Ihrem Beispiel ging ich noch einen Schritt weiter (weil das Generieren von: Jahr,: Monat,: Tag nicht direkt war) und fügte meinem Modell namens named_route_generator eine Methode hinzu, die einen Hash der Werte zurückgibt. Jetzt in der Ansicht, ich mache nur: show_url (post.named_route_generator). Vielen Dank. –

+2

Leider funktionieren Dinge wie 'present_page_url (@post)' oder 'url_for (@post)' nicht mit dieser Lösung. –

1

Hier ist, wie ich dazu ging ...

Zuerst versuche ich, nicht die Route-generierte URL-Methode zu verwenden. Auch werde ich nicht in dem Maße wie Sie in Bezug auf die Formatierung der Datumsparameter überprüfen. Da ich die Datumsstempel und die URL-Erstellung automatisch erzeuge, mache ich mir keine Gedanken über die Formatvalidität. Ich formatiere einfach ein ActiveSupport :: TimeWithZone-Objekt.

Beginnen wir mit der entsprechenden Route starten:

map.post_by_date 'content/:year/:month/:day/:slug', 
        :controller => 'posts', 
        :action  => 'show_by_date_slug' 

Da ich nicht über Argument Formatierung beunruhigen wollte, oder Wiederholung, habe ich eine Hilfsmethode und enthalten die Helfer in der entsprechenden Controller:

def pubdate_slug_url(post) 
    year = post.published_on.strftime('%Y') 
    month = post.published_on.strftime('%m') 
    day = post.published_on.strftime('%d') 

    url = "/" + ["content", year, month, day, post.slug].join("/") 

    return url 
    end 

Schließlich meiner Meinung nach, habe ich einfach die Methode aufrufe, in Objekt meines Beitrags vorbei:

<h2><%= link_to post.headline, pubdate_slug_url(post) %></h2> 

Ich am Ende mit einer URL wie: http://wallscorp.us/content/2009/12/06/links

Prost.