2010-05-11 12 views
7

Las rutas de los raíles son geniales para combinar el estilo RESTful '/' bits separados de una URL, pero ¿puedo hacer coincidir los parámetros de consulta en una configuración map.connect? Quiero que se invoquen controladores/acciones diferentes dependiendo de la presencia de un parámetro después del '?'.Rutas rutas que coinciden con los parámetros de consulta

yo estaba tratando algo como esto ...

map.connect "api/my/path?apple=:applecode", :controller => 'apples_controller', :action => 'my_action' 
map.connect "api/my/path?banana=:bananacode", :controller => 'bananas_controller', :action => 'my_action' 

Para los propósitos de enrutamiento que no se preocupan por el valor del parámetro, siempre que esté disponible para el controlador en el params de hash

+1

Este es probablemente va a ser muy difícil de hacer con la incorporada en el motor de enrutamiento, ya que sólo trata con la porción de ruta de la solicitud. Los parámetros de consulta son analizados por otra capa. Podría ser posible usar Rack para volver a escribir la URL a medida que entra para hacerlo enrutable. – tadman

Respuesta

1

A menos que exista una razón concreta por la que no puede cambiar esto, ¿por qué no hacer que sea tranquilo?

map.connect "api/my/path/bananas/:id, :controller => "bananas_controller", :action => "my_action"

Si usted tiene muchos parámetros, por qué no usar un POST o una PUT para que sus parámetros no deben ser expuestos por la url?

10

La siguiente solución se basa en la sección "Restricciones avanzadas" de la guía de rieles "Rails Routing from the Outside In" (http://guides.rubyonrails.org/routing.html).

En su archivo config/routes.rb, incluya una clase de reconocedor que tenga coincidencias? método, por ejemplo:

class FruitRecognizer 
    def initialize(fruit_type) 
    @fruit_type = fruit_type.to_sym 
    end 

    def matches?(request) 
    request.params.has_key?(@fruit_type) 
    end 
end 

A continuación, utilice los objetos de la clase como restricciones de enrutamiento, como en:

map.connect "api/my/path", :contraints => FruitRecognizer.new(:apple), :controller => 'apples_controller', :action => 'my_action' 
Cuestiones relacionadas