2010-02-13 5 views
7

Ho un problema in cui ho bisogno di valori passati da una richiesta GET e non so come impostare la definizione di routing.Rails Routing con stringa di query

L'oggetto Categoria ha un tipo (stringa), un colore (stringa) e molti prodotti. Voglio creare un semplice servizio web che consente al chiamante ottenere tutti i prodotti di una categoria passando per tipo e il colore della Categoria:

http://www.myapp.com/getProducts?catType=toy&color=red 

o?

http://www.myapp.com/categories/getProducts?catType=toy&color=red 

Come si definisce il routing corretto per questa situazione? Ci sono modi migliori per farlo in maniera Restful ... perché so che Rails è Restful, quindi se c'è un modo per farlo "correttamente" allora sarebbe ancora meglio.

Grazie

risposta

11

Il tuo primo esempio:

map.getproduct '/getProduct', :controller => 'your_controller', :action => 'your_action' 

Nel controllore si avrà catType e il colore in params hash:

params[:catType] 
=> 'toy' 
params[:color] 
=> 'red' 

C'è modo migliore? Probabilmente sì, ma dipende dalle tue esigenze. Se si avrà sempre i parametri catType e colore, che è possibile aggiungere percorso come questo:

map.getproduct '/getProduct/:catType/:color', :controller => 'your_controller', :action => 'your_action' 

Si avrà accesso a tali parametri con params hash come nell'esempio precedente.E gli URL sarà simile a questo:

www.myapp.com/getProduct/toy/red 

Se i parametri possono cambiare, è possibile utilizzare percorso globbing:

map.getproduct '/getProduct/*query', :controller => 'your_controller', :action => 'your_action' 

allora sarà catturare tutte le richieste che ha www.my.app.com/getProduct/... agli inizi. Ma avrai più lavoro nel controller. Avrete accesso a query con questo:

params[:query] 

e per www.myapp.com/getProduct/color/red/catType/toy Darà:

params[:query] 
=> ['color', 'red', 'catType', 'toy] 

quindi bisogna analizzarlo manualy.

+0

Grande ... il metodo Restful era esattamente quello che volevo! Verifica e up-voto. –

+1

Non mi importa che sia riposante. Questi percorsi cercano solo una raccolta di prodotti. La risposta di @chrisdinn è più riposante, ma penso che i percorsi di ricerca non debbano essere riposanti. Restful è principalmente per ottenere la raccolta di oggetti e per la manipolazione di uno di quegli oggetti. Ma comunque sono felice che la mia risposta sia stata utile! – klew

4

Un modo RESTful per fare questo comporterebbe una risorsa prodotto nidificato sotto una risorsa categoria, in questo modo:

http://www.myapp.com/categories/toy/products?color=red

tuo routes.rb dovrebbe contenere:

Dal momento che il mio url sopra utilizzando l'attributo type della categoria per il routing, sto insinuando che ogni tipo è unico, come un id. Significa che quando carichi una categoria nel controller Categorie (o in qualsiasi altro luogo) dovrai caricare la categoria con Category.find_by_type(params[:id]) anziché Category.find(params[:id]). Mi piacciono le categorie di routing in questo modo quando possibile.

La vostra azione ProductsController indice del controller avrebbe trovato prodotti che utilizzano le linee come:

@category = Category.find_by_type(params[:category_id]) 
    @products = @category.products.find(:all, :conditions => { :color => params[:color]}) 

Ricordate, il vostro modello di categoria deve contenere la riga:

has_many :products 

è probabile una buona idea per far rispettare che nel modello con convalide:

validates_presence_of :type 
validates_uniqueness_of :type 

Per rendere il routing lavorate si dovrebbe anche sovrascrivere il metodo to_param nel modello di categoria per tipo di ritorno, invece di id:

def to_param 
    self.type 
end 
+2

questo non era esattamente quello che stavo cercando ... ma ti ho ancora dato un voto perché il tuo post è stato utile e informativo. –