2009-03-30 7 views
0

Sagen Sie, wenn ich einen Controller habe, Profil, das nur zwei Aktionen hat. Die erste ist list, die nur die Liste der Namen anzeigen wird. Ich möchte, dass diese Namen Links sind, die Sie dann zu einer Seite führen, auf der das vollständige Profil angezeigt wird. Also brauche ich eine zweite Aktion, view, die dann einen Parameter eingeben kann, um anzugeben, welches Profil angezeigt werden soll.Hilfe mit Rails Routen

Zum Beispiel: Ich würde auf /profile/list zugreifen, dann, wenn ich Johns Profil anzeigen möchte, werde ich auf seinen Namen klicken, der mich zu /profile/view/john bringen sollte. Meine Ansichtsaktion liest den John-Parameter und führt dann die entsprechenden Datenbankabfragen durch.

Welche Änderungen muss ich an routes.rb vornehmen, damit dies geschieht? Prost.

Antwort

0

Ich würde eher den Standard verwenden: controller /: action /: id Route gegen Fälle zu schützen, wo es 2 John ist in der Liste.

Um eine benutzerdefinierte Route haben, wie Sie bearbeiten routes.rb erwähnt einen neuen

map.connect ':controller/:action/:user_name' 

jetzt eine Anfrage enthalten wie Profil/view/john sollten Sie als

@params = {:controller => "profile", :action=> "view", :user_name => "john"} 

Nutzung erreichen Der Parameter params [: user_name] zum Suchen und Anzeigen des relevanten Datensatzes in der Ansichtsaktion des Controllers. Sie können auch einige Anforderungen für den Teil: user_name der URL festlegen, z. es muss passen/SomeRegexpToValidateNames/

map.connect ':controller/:action/:user_name', 
    :requirements => {:user_name => /\w+/} 
+0

Wie ändere ich map.connect: controller /: action /: user_name ', damit ich Profil/Ansicht festcode. Weil mir andere Dinge wie/eins/zwei/drei egal sind. – alamodey

+0

/eins/zwei/drei würden versuchen, die Aktion namens two on one_controller aufzurufen. Schienen sollten nicht in der Lage sein, dies zu finden und dies mit einer "generischen Seite nicht gefunden" zu behandeln. Wenn Sie dies wirklich fest codieren möchten, können Sie stringenter festlegen: anforderungen => {: controller =>/profile /,: action =>/view /, ..} – Gishu

-1

Wenn das Modell "user" ist, müssen Sie die to_param-Methode überschreiben. Dadurch können Sie den "ID-Namen" des Benutzers anstelle der "ID" zurückgeben. (ex:/profile/view/23-john)

Ich weiß, es ist nicht genau das, wonach Sie gefragt haben, aber das sollte eine einfache Lösung sein.

class User < ActiveRecord::Base 
    def to_param 
    "#{id}-#{name.gsub(/\W/, '-').downcase}" 
    end 
end 

Und nur eine einfache Ressource Erklärung zur Routing-Konfiguration hinzufügen:

map.resources :users