Benutzerdefinierte Parameter in der URL für die show-action

Arbeite ich an der Umsetzung einer SEO-hiarchy, was bedeutet, dass ich muss voranstellen Parameter für eine show-Aktion.

Der use-case ist eine such Seite wo die URL-Struktur ist:

/cars/(:brand)/ => eine Liste Seite

/cars/(:brand)/(:model_name)?s=query_params => Suche Aktion

/cars/:brand/:model_name/:variant/:id => ein Auto-show-action

Mein problem ist, die show-action URLs funktionieren, ohne :brand, :model_name und :variant als einzelne Argumente. Sie sind immer verfügbar, aus der die Werte für die Ressource.

Was ich habe:
/cars/19330-Audi-A4-3.0-TDI

Was ich will
/cars/Audi/A4/3.0-TDI/19330

Zuvor, wurde diese, wie die routes.rb aussah:

# Before
resources :cars. only: [:show] do
  member do
  get 'favourize'
  get 'unfavourize'
end

Folgenden war mein Erster Versuch:

# First attempt
scope '/cars/:brand/:model_name/:variant' do
  match ":id" => 'cars_controller#show'
  match ":car_id/favourize" => 'cars_controller#favourize', as: :favourize_car
  match ":car_id/unfavourize" => 'cars_controller#unfavourize', as: :unfavourize_car
end

Dies macht es möglich:

cars_path(car, brand: car.brand, model_name: car.model_name, variant: car.variant)

Aber das ist natürlich nicht wirklich ideal.

Wie ist es möglich, um den setup-Routen (und vielleicht die .to_param Methode?) in einer Weise, die nicht machen es eine mühsame Aufgabe, um das alles zu ändern link_to Anrufe?

Vielen Dank im Voraus!

-- UPDATE --

Mit @tharrisson ' s Vorschlag, das ist, was ich versucht habe:

# routes.rb
match '/:brand/:model_name/:variant/:id' => 'cars#show', as: :car

# car.rb
def to_param
  # Replace all non-alphanumeric chars with - , then merge adjacent dashes into one
  "#{brand}/#{model_name}/#{variant.downcase.gsub(/[^[:alnum:]]/,'-').gsub(/-{2,}/,'-')}/#{id}"
end

Der route funktioniert einwandfrei, z.B. /cars/Audi/A4/3.0-TDI/19930 zeigt die richtige Seite. Die Generierung der link mit to_param jedoch nicht funktioniert. Beispiel:

link_to "car link", car_path(@car)
#=> ActionView::Template::Error (No route matches {:controller=>"cars", :action=>"show", :locale=>"da", :brand=>#<Car id: 487143, (...)>})
link_to "car link 2", car_path(@car, brand: "Audi")
#=> ActionView::Template::Error (No route matches {:controller=>"cars", :action=>"show", :locale=>"da", :brand=>"Audi", :model_name=>#<Car id: 487143, (...)>})

Schienen nicht zu wissen scheint, wie zu übersetzen, die to_param in einem gültigen link.

  • Dies ist eine wirklich gute und gut geschriebene Frage. Ich glaube, ich habe eine Idee und will sicherstellen, dass ich bin auf dem richtigen Weg (kein Wortspiel beabsichtigt). Ist es der Fall, dass Sie in der Lage sein zu verwenden cars_path(@car) in Ihrem link_to ' s aus, und generieren Sie die schöne hierarchische URL aus Ihren Ansichten,, sondern haben auch den router erkennen "teilweise" URLs (z.B. /cars/Audi) als Aufforderung zur Liste Audis? Oder ist es eine zusätzliche Anforderung für die link_to werden kontextuell bewusst (z.B. so schafft es die links zu der /cars/Marke-Variante von einigen controller-Aktionen, aber das volle Auto URL von den anderen controller-Aktionen?
  • Danke, @tharrison. Ich denke, du hast es richtig ist; ich möchte in der Lage sein zu verwenden cars_path(@car) in meinem link_to. Welche Aktion ausgelöst wird, kann gesteuert werden durch Einschränkungen in der routes.rb. Dies bedeutet, dass die urls für cars/Audi nicht verwenden cars_path aber so etwas wie brand_path(brand: "Audi").
  • OK, die Anreise, aber ich weiß nicht so Recht, hab es dann :-). Wenn Sie möchten, verwenden Sie benannte Routen wie brand_path, die Argumentation wäre eine Instanz von der Marke, Modell ... obwohl, dass könnte sein, wie brand_path(@car.brand). Haben Sie eine Marke, Modell und Ressourcen in die Routen für das?
  • Nein, es ist kein Modell für die "Marke", "model_name" und "Variante". Es mag scheinen, eingängig, aber es macht sehr viel Sinn 🙂 Neben das Auto-Objekt, es ist nur strings.
  • Hab ihn -- Nein, das macht Sinn (zumindest für Modellname und-Varianten, möchten Sie vielleicht denken über die Marke, nur um sicherzustellen, dass die Konsistenz der Namensgebung, etc.), wollte nur sicher sein 🙂 OK, jetzt werde ich sehen, ob ich es herausfinden 🙂
  • Genial! Ich wirklich zu schätzen.
  • Ich denke, das ist, was du suchst: guides.rubyonrails.org/...
  • Sie erstellen route nur für cars_path Helfer, siehe meine Antwort unten

Schreibe einen Kommentar