Frage

DocumentsController # common_query mehrere verschiedene Arten Anfrage verarbeiten kann.

d. Alle Dokumente im Batch-4 oder alle Dokumente tagged „glücklich“

Ich möchte eine einzige Route em recht zu machen, so:

/ documents / common_query? Batch = 4

/ documents / common_query? Tag = glücklich

werden:

/ documents / Batch / 4

/ Dokumente / Tag / happy

Also das Endergebnis ist, dass #common_query genannt wird, sondern Teil der URL wurde als param name und ein Teil verwendet, da es Wert ist.

War es hilfreich?

Lösung

Als einzige Route:

ActionController::Routing::Routes.draw do |map|
  map.connect "documents/:type/:id", :controller => "documents_controller", 
              :action => "common_query"
end

Dann wird params[:type] entweder "batch" oder "tag" werden und params[:id] entweder "4" oder "happy". Sie müssen sicherstellen, dass andere Aktionen für die DocumentsController bevor diese kommen in den Strecken, weil diese jede URL wird übereinstimmen, wie "documents/*/*" aussieht.

Aber warum muss es ein einziger Weg sein? Sie könnten zwei Routen wie folgt verwenden:

map.with_options(:controller => "documents_controller", 
                 :action => "common_query") do |c|
  c.connect "documents/batch/:page", :type => "batch"
  c.connect "documents/tag/:tag",    :type => "tag"
end

, die die gleiche Wirkung haben wird, ist aber präziser, so dass Sie nicht über die Rangfolge der Strecke kümmern würden.

Andere Tipps

Die zweite Option, mit zwei Routen, ist mit ziemlicher Sicherheit der bessere Weg zu gehen, denn es ist nur, dass die Arten von URLs übereinstimmen, die Sie unterstützen möchten, während die erste Option wird auch wie / Dokumente URLs „entsprechen“ / foo / Bar, die Ihre #common_query Methode wahrscheinlich eine RecordNotFound (404) als Reaktion auf, bestenfalls dazu führen werden, zurück. Im schlimmsten Fall, wenn Sie nicht bereit sind keinesfalls Ihre erwartete params zu sehen, die Sie erhalten einen 500-Fehler statt ...

Natürlich, wenn Sie eine Menge von Variationen beginnen mit, am Ende mit vielen Routen auf. Und wenn Sie brauchen, um sie in Kombination zu verwenden, zum Beispiel / documents / Batch / 4 / tag / glücklich, dann müssen Sie eine Wildcard Route verwenden, und führen Sie die Parameterbearbeitung in Ihrem Controller. Dies könnte etwa so aussehen:

map.connect 'documents/*specs', :controller => "documents_controller", :action => "common_query"
[: Spezifikationen]

Die verschiedenen Elemente der URL wird der Controller als params zur Verfügung. Sie könnten, dass in einem Fund drehen etwa so:

@items = Item.find(:all, :conditions => Hash[params[:specs]])

Das Hash [] Technik wandelt das eindimensionale Array von Optionen in eine Schlüssel-Hash-Wert, der sogar nützlich sein könnte, wenn man nicht direkt an einen Fund Fütterung ().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top