Schienen 4 & 5
In Rails 4 wurde die :param
Option hinzugefügt, die genau das zu tun scheint, wonach Sie suchen. Sie können sich den Rails 3-Code im Vergleich zum Rails 4-Code ansehen .
Einzelheiten
Sie können dies einfach in Ihre routes.rb
Datei implementieren :
# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
Ab der Veröffentlichung von Rails 4 ist diese Funktionalität in den Rails-Handbüchern dokumentiert .
Schienen 3
Leider ist in Rails 3 die :key
Option fürresources
entfernt, sodass Sie den Namen für auf diese Weise erstellte Routen nicht mehr einfach ändern können, indem Sie einfach eine zusätzliche Option übergeben.
Einzelheiten
Ich gehe davon aus, dass Sie die Anwendung im letzten Jahr bereits irgendwie so zum Laufen gebracht haben, wie Sie es möchten, aber ich werde einen Weg gehen, um den in Rails 3 beschriebenen Effekt zu erzielen routes.rb
. Es wird nur ein bisschen mehr Arbeit als die to_param
Methode erfordern. Sie können immer noch benutzerdefinierte Parameter in Routen definieren definiert mit scope
und match
(oder Vettern get
, put
, post
, unddelete
). Sie schreiben einfach den gewünschten Parameternamen in den Matcher:
get 'clients/:client_name', :to => 'clients#show', :as => client
scope 'clients/:client_name' do
get 'sites/:name', :to => 'sites#show', :as => site
end
Sie müssten alle Routen, die resources
automatisch für Sie erstellt werden, manuell hinzufügen , aber es würde das erreichen, wonach Sie suchen. Sie können die :controller
Option mit scope
und zusätzliche scope
Blöcke auch effektiv verwenden , um einen Teil der Wiederholung zu entfernen.
BEARBEITEN (8. Mai 2014): Machen Sie deutlicher, dass die Antwort Informationen für Rails 3 und 4 enthält. Aktualisieren Sie die Links zum Code, um genaue Zeilennummern und Commits zu erhalten, damit sie über einen längeren Zeitraum funktionieren.
BEARBEITEN (16. November 2014): Rails 4 sollte jetzt ganz oben stehen und relevante Informationen enthalten, da es sich seit einiger Zeit um die aktuelle Version von Rails handelt.
BEARBEITEN (9. August 2016): Beachten Sie, dass die Lösung in Rails 5 noch funktioniert, und aktualisieren Sie veraltete Links.
param
Option für Schienen 3: gist.github.com/sj26/44ef47fe8b98b46ee32dpost_slug
, was verwirrend sein kann.Übergeben Sie in Rails 4 die Option param, um die Parameter: id zu ändern. Zum Beispiel
resources :photos, param: :photo_name
wird / photos /: photo_name generiertquelle
Wenn ich dich richtig verstehe, willst du das
client_name
stattid
in deiner URL haben, oder?Sie können dies tun, indem Sie die
to_param
Methode in Ihrem Modell überschreiben . Weitere Informationen erhalten Sie hier .quelle
Dafür gibt es ein Juwel, genauso wie es für alles ein Juwel gibt;)
Ich habe FriendlyId für diese Art von Verhalten in Rails 3 verwendet.
Dazu müssen Sie Ihrem Modell jedoch Code hinzufügen:
... und wenn Ihre Clients keine URI-kompatiblen Namen haben, möchten Sie möglicherweise einen Slug dafür verwenden, mit dem Sie arbeiten können
has_friendly_id :name, :use_slug => true
. Wenn Sie Slugs verwenden, müssen Sie diese natürlich auch in der Datenbank speichern.Und wie bereits erwähnt, können Sie den
to_param
Trick mit Schienen 3 weiterhin verwenden, wie hier dokumentiert . Ich finde FriendlyId allerdings etwas vielseitiger.quelle
to_param
, aber es macht auch einige andere clevere Dinge im Hintergrund. Ich habe den Link hier gefunden: stackoverflow.com/questions/4744446/…to_param
bricht meinen Front-End-Teil der App. Eigentlich suche ich verzweifelt nach dem Routing-Ansatz: Ich muss meine API ändern, ohne jedoch den Modell- und Frontend-Teil aus der App zu entfernen. Warum kann ich nicht einfach den Ansatz haben, nur die Routen zu ändern, wie ich angegeben hatte, und den Beispielbeitrag für eine ältere Version der Schienen oben?@client = Client.find(:name => param[:client_name]
inClientsController#show
? Das könnte funktionieren.Client.where(:name => param[:client_name]).first
, das ist.In Rails 3 können Sie die ID-Schlüssel mithilfe einer Kombination aus Namespaces und Bereichen wie folgt umbenennen (allerdings nicht sehr schön):
quelle