Nome e valore del parametro (in modo indipendente) come parte di Rails Route
-
19-08-2019 - |
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.
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 ().