2017-06-07 3 views
0

Ich habe ein Modell 'Artikel'. Es funktioniert alles gut, bin jedoch nicht völlig zufrieden mit seinem Show-Pfad. Ich möchte bestimmte Parameter aus der Items-Tabelle verwenden, um eine SEO-freundlichere URL zu erstellen. So, hier ist meine Frage ..Wie erstelle ich eine benutzerdefinierte Route für die Show-Aktion in Rails 5?

Wie kann ich meine Anzeigen Aktion url ändern von 'mysite.com/items/1' zu ‚mysite.com/items/item-name/item- city ​​/ item-id ' Dabei sind Artikelname, Artikel-Stadt und Artikel-ID für jeden spezifischen Artikel dynamisch.

Ist es möglich, dies ohne ein Juwel zu erreichen? wenn ja, wie? Wenn nein, welches Juwel würden Sie vorschlagen, dies auf einfachste Weise zu erreichen?

Dank

Antwort

1

Sie etwas relativ einfach tun und treu bleibt Rails durch eine to_param Methode zum Modell hinzugefügt wie so:

def to_param 
    "#{id}-#{name}-#{city.name}" 
end 

Was das bedeutet ist, jedes Mal, wenn eine Methode, wie die Verwendung item_path, verwendet es die @ item.to_param-Methode (das ist es, was es jetzt tut, und gibt zurück: id). Generieren der normalen Route, aber Ersetzen des ID-Parameters durch den SEO-freundlichen.

Und auf der anderen Seite, wenn Sie gehen, um zu finden (params [: ID]) in der Steuerung in Ihrer Show, bearbeiten, löschen oder aktualisieren Aktionen, wird es auf eine to_i darauf und drehen Sie es zurück eine ID. Dies ist, was es jetzt tut, aber to_i auf einem int ist immer noch ein int.

Ihre Urls so etwas wie

/items/56-boston-itemname 

Der andere Vorteil dieser aussehen wird, wenn Sie den Artikelnamen oder den Namen der Stadt passieren zu ändern, wird es alle entsprechend Urls ändern, aber alt Urls, die gesendet wurden in E-Mail wird immer noch funktionieren.

+0

Beide Lösungen sind gut bezeichnen würde. –

1

Ein Ansatz für dieses Problem ist, Route Globbing zu verwenden:

http://guides.rubyonrails.org/routing.html#route-globbing-and-wildcard-segments

Sie sollten in der Lage sein, so etwas zu tun:

get 'items/*names/:id', to: 'items#show', as: :item_names_path 

Und setzen, was Sie in *names wollen. Dies würde ein wenig experimentieren, um es richtig zu machen. Ich könnte dem Objekt eine Methode hinzufügen, um das Array names zu erstellen.

def names 
    [city.name, name].uniq.compact 
end 

Dann glaube ich, Sie item_names_path(@item.names, @item)

Verwandte Themen