Domanda

DocumentsController # common_query può gestire più stili di richiesta diversi.

vale a dire. tutti i documenti nel batch 4 o tutti i documenti taggati " felice "

Voglio un unico percorso per renderli belli, quindi:

/ documenti / common_query? Lotto = 4

/ tag / documenti common_query? = Felice

diventa:

/ documenti / batch / 4

/ documenti / tag / felice

Quindi il risultato finale è che #common_query viene chiamato ma parte dell'url è stata usata come nome del parametro e parte come valore.

È stato utile?

Soluzione

Come percorso singolo:

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

Quindi params [: type] sarà " batch " o " tag " e params [: id] " 4 " o " happy " . Dovrai assicurarti che altre azioni per il DocumentsController precedano questo nei percorsi perché corrisponderà a qualsiasi URL che assomigli a " documenti / * / * " .

Ma perché deve essere un singolo percorso? È possibile utilizzare due percorsi in questo modo:

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

che avrà lo stesso effetto, ma è più specifico, quindi non dovresti preoccuparti dell'ordine prioritario delle rotte.

Altri suggerimenti

La seconda opzione, con due percorsi, è quasi sicuramente la strada migliore da percorrere, perché corrisponderà solo al tipo di URL che si desidera supportare, mentre la prima opzione sarà anche " match " URL come / documents / foo / bar, che probabilmente causeranno al tuo metodo #common_query, nella migliore delle ipotesi, una risposta RecordNotFound (404). Nel peggiore dei casi, se non sei pronto a non vedere nessuno dei tuoi parametri previsti, otterrai invece un errore 500 ...

Ovviamente, se inizi ad avere molte varianti, finisci con molti percorsi. E se devi usarli in combinazione, ad esempio, / documenti / batch / 4 / tag / happy, allora dovrai usare un percorso jolly ed eseguire l'elaborazione dei parametri nel tuo controller. Questo potrebbe assomigliare a:

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

I vari elementi dell'URL saranno disponibili come controller [params]. Potresti trasformarlo in una scoperta in questo modo:

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

Quella tecnica di Hash [] converte l'array monodimensionale di opzioni in un hash valore-chiave, che potrebbe essere utile anche se non lo si sta alimentando direttamente in find ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top