2010-02-13 10 views
7

Tengo un problema en el que necesito valores pasados ​​desde una solicitud GET y no sé cómo configurar la definición de enrutamiento.Rieles Enrutamiento con cadena de consulta

Mi objeto de categoría tiene un tipo (cuerda), un color (cadena) y muchos productos. Quiero crear un servicio web simple que permite a la persona que llama llegar todos los productos de una categoría pasando en el tipo y color de la Categoría:

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

o?

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

¿Cómo puedo definir el enrutamiento correcto para esta situación? ¿Hay mejores formas de hacerlo de una manera relajada ... porque sé que Rails está en reposo, así que si hay una forma de hacerlo "correctamente", eso sería aún mejor.

Gracias

Respuesta

11

Su primer ejemplo:

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

En el controlador tendrá catType y color en la almohadilla params:

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

¿Hay alguna manera mejor? Probablemente sí, pero depende de tus necesidades. Si usted siempre tendrá parámetros catType y de color, que puede agregar ruta así:

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

Usted tendrá acceso a esos parámetros con picadillo params como en el ejemplo anterior.Y sus direcciones URL siguiente aspecto:

www.myapp.com/getProduct/toy/red 

Si sus parámetros pueden cambiar, puede utilizar comodines ruta:

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

A continuación, se captura toda petición que tiene www.my.app.com/getProduct/... en el comienzo. Pero tendrás más trabajo en el controlador. Usted tendrá acceso a query con esto:

params[:query] 

y para www.myapp.com/getProduct/color/red/catType/toy Dará:

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

Así que hay que analizar manualy.

+0

Genial ... el método de descanso fue exactamente lo que quería. Comprobar y votar por arriba. –

+1

No creo que sea relajante. Esas rutas solo buscan alguna colección de productos. La respuesta de @chrisdinn es más tranquila, pero creo que las rutas de búsqueda no necesitan descanso. Restful es principalmente para obtener colección de objetos y para la manipulación de uno de esos objetos. ¡Pero de todos modos estoy feliz de que mi respuesta haya sido útil! – klew

4

Una forma REST para hacer esto implicaría un recurso anidado producto por debajo de un recurso categoría, así:

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

Su routes.rb tendría que contener:

map.resources :categories do |category| 
    category.resources :products 
    end 

Como mi url anterior usa el atributo de tipo Categoría para el enrutamiento, estoy implicando que cada tipo es único, como un id. Significará que cada vez que cargue una categoría en el controlador de Categorías (o en cualquier otro lugar) deberá cargar la categoría con Category.find_by_type(params[:id]) en lugar de Category.find(params[:id]). Me gusta enrutar categorías de esta manera siempre que sea posible.

Su acción index del controlador ProductsController sería encontrar productos utilizando frases como:

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

Recuerde, su modelo de categoría debe contener la línea:

has_many :products 

es probable una buena idea que lo imponen en el modelo con validaciones:

validates_presence_of :type 
validates_uniqueness_of :type 

Para enrutar trabaja también debe sobrescribir el método to_param en el modelo Categoría volver tipo de lugar de Identificación:

def to_param 
    self.type 
end 
+2

esto no era exactamente lo que estaba buscando ... pero aún así le di una votación positiva porque su publicación fue útil e informativa. –

Cuestiones relacionadas