2010-04-04 6 views
6

Ich verstehe, wie eine Vanity-URL in Rails zu schaffen, um zu übersetzen http://mysite.com/forum/1 in http://mysite.com/some-forum-nameWie implementieren Sie "kurze" verschachtelte Vanity-URLs in Schienen?

Aber ich würde es gerne noch einen Schritt weiter nehmen und die folgenden Arbeits (wenn es überhaupt möglich ist):

Statt: http://mysite.com/forum/1/board/99/thread/321

ich im ersten Schritt möchte so zu etwas bekommen: http://mysite.com/1/99/321

und hat es schließlich wie http://mysite.com/some-forum-name/some-board-name/this-is-the-thread-subject.

Ist das möglich?

+0

Ressourcen Routing, verschachtelten Routing und flache Routing werden alle die Namen der Ressource im Weg haben, gehen, so Wenn Sie nur IDs oder irgendeinen Forumsnamen im Pfad haben wollen, müssen Sie reguläres Routing durchführen, wahrscheinlich mit beschränkten Parametern. – Corey

Antwort

2

Werfen Sie einen Blick auf die Rails Routing from the Outside In guide.

+0

das ist, was ich gelesen habe, aber ich kann nicht scheinen, von den verfügbaren Beispielen und Beschreibungen zu begreifen, was zu den Ergebnissen führen soll, die ich suche. Ist es flach nistend? :hat viele? Oder mit map.connect und Platzhaltern (die einige Leute sagen, Sie sollten nicht verwenden) ... ein bisschen auf der Suche nach einem Hinweis in die richtige Richtung hier. – UnSandpiper

1

versuchen vielleicht so etwas wie

map.my_thread ':forum_id/:board_od/:thread_id.:format', :controller => 'threads', :action => 'show' 

Und dann in Ihrem Controller haben

@forum = Forum.find(params[:forum_id]) 
@board = @forum.find(params[:board_id]) 
@thread = @board.find(params[:thread_id]) 

Beachten Sie, dass Sie haben können, dass MODEL_ID nichts (der Name in diesem Fall) sein

In Ihrem Ansicht, können Sie

<%= link_to my_thread_path(@forum, @board, @thread) %> 
verwenden

Ich hoffe, das

5

hilft diese Arbeit „gut“ mit den Rails URL Helfer haben Sie to_param in Ihrem Modell außer Kraft setzen müssen:

def to_param 
    permalink 
end 

Wo permalink vielleicht erzeugt wird durch eine before_save

before_save :set_permalink 

def set_permalink 
    self.permalink = title.parameterize 
end 

Der Grund, warum Sie einen Permalink erstellen, ist, dass Sie möglicherweise einen Titel haben, der nicht URL-freundlich ist. Das ist, wo parameterize hereinkommt.

Nun, wie zum Finden dieser Beiträge basierend auf was permalink ist, können Sie entweder die einfache Route oder die harte Route gehen.

Einfache Strecke

to_param definieren etwas anders:

def to_param 
    id.to_s + permalink 
end 

Forum.find(params[:id]) Weiter mit dem params[:id] etwas wie 1-my-awesome-forum wäre. Warum funktioniert das noch? Nun, Rails ruft to_i für das Argument, das an find übergeben wird, und das Aufrufen von to_i für diese Zeichenfolge wird einfach 1 zurückgeben.

harter Weg

Leave to_param gleich.Resort zu verwenden find_by_permalink in Ihrem Controller, mit params[:id], die in Form geführt wird, um die Routen:

Model.find_by_permalink(params[:id]) 

Nun zum spaßigen Teil

Jetzt können Sie die Ressource aus der URL zu nehmen. Nun, es ist ein Sisyphus-Ansatz. Sicher, Sie könnte stoppen mit den Routing-Helper Ruby on Rails bietet wie map.resources und definieren sie mit map.connect aber ist es wirklich so viel Gewinn wert? Welche "besonderen Superkräfte" gewährt es dir? Keine, fürchte ich.

Aber nach wie vor, wenn Sie das tun wollen, ist hier ein guter Ausgangspunkt aus:

get ':forum_id/:board_id/:topic_id', :to => "topics#show", :as => "forum_board_topic" 
Verwandte Themen