2010-04-13 14 views
16

Ich versuche, URLs wie dies in Rails zu erreichen:ID + Slug Name in URL in Rails (wie in Stackoverflow)

http://localhost/posts/1234/post-slug-name 

sowohl mit ID und Slug-Namen anstelle von entweder

http://localhost/posts/1234 

oder

http://localhost/posts/post-slug-name 

(jetzt haben slug I Name nur in URL, so dass dieser Teil ist vorbei). Wie kann ich das machen?

UPD

ich einen Artikel zu diesem Thema gefunden: http://augustl.com/blog/2009/styling_rails_urls/, statt /id/slug es /id-slug zu verwenden, schlägt vor, die perfekt funktioniert für mich, so dass ich mit diesem gehen.

Antwort

9

Sie sollten zusätzlich zu Ihrer Ressourcenroute eine reguläre Route mit Route Globbing hinzufügen (vorausgesetzt natürlich, dass Ihre posts Routen definiert sind). Zum Beispiel

map.resources :posts 
map.connect '/posts/:id/*slugs', :controller => 'posts', :action => 'show' 
30

Rails hat einige eingebaute Unterstützung für SEO-freundliche URLs. durch einfaches Überschreiben der to_param Methode in Ihrem Modell "id-title":

Sie können eine URL in der Form erstellen.

Dies ist von einem meiner Projekte und erstellt eine URL mit der ID, Kategorienamen und Modellname:

def to_param 
    "#{id}-#{category.name.parameterize}-#{name.parameterize}" 
end 

Rails intelligent genug, um diese in die Ebene id zurück zu extrahieren, wenn Sie Ihren Controller-Aktion zugreifen die folgenden Werke, so einfach:

def show 
    @model = Model.find(params[:id]) 
    render :action => "show" 
end 
+0

Ja, das ist, was ich in UPD habe. Ich habe diesen Ansatz auch benutzt. – Vitaly

+0

Ausgezeichnet !! hat super funktioniert! Vielen Dank! – yorch

7

Verwendung friendly_id. Es hat ein nettes Feature: Sie können Ihre URL aktualisieren, ohne die alte zu brechen.

Generating view url funktioniert nicht für mich. Habe ich nur noch eine kleine Methode im Modell

def to_param 
    self.friendly_id 
end 
0

die stringex gem enthält ActsAsUrl URI freundliche Darstellungen eines Attributs

https://github.com/rsl/stringex

Es enthält auch eine Unidecoder-Bibliothek zu erstellen, die Unicode umwandeln zu ASCII.

0

I wrote a post über Slugs in Rails 3. Es bietet hübsche URLs und noch mehr, sichert Ihre Website von zufälligen Skripten, die nach Informationen nur durch die Erhöhung der IDs fragen. Es vermeidet auch das Speichern von Slugs in der Datenbank.

4

Ich weiß, die Frage ist ziemlich alt, aber ich denke, es verdient immer noch etwas Interesse und keine der Antworten sind auf dem neuesten Stand oder bieten eine Möglichkeit, genau das, was das OP gesucht (d. H. http://localhost/posts/1234/post-slug-name).

In Routen.rb

get 'posts/:id/:slug', to: 'posts#show', as: 'slugged_post' 

Dann in den Ansichten

<%= link_to slugged_post_path(post, post.name.parameterize) %> 

Sie möchten vielleicht eine Schnecke Methode in Ihrem Modell definieren, zu vermeiden, in den Ansichten Aufruf parametrieren.

+1

das sollte 'slugged_post_path' im' link_to' Aufruf sein. – Rystraum