2011-10-07 16 views
5

Estoy tratando de escribir una ruta general en Rails 3, pero quiero reservar algunos términos en ella. Estoy específicamente siguiendo el ejemplo planteado en este post, en la respuesta de David Burrows: Dynamic routes with Rails 3Rails 3: hacer una ruta fácil para leer y modificar

La sintaxis que estoy usando es el siguiente:

match '*path' => 'router#routing', :constraints => lambda{|req| (req.env["REQUEST_PATH"] =~ /(users|my-stuff)/).nil? } 

Ahora, que la sintaxis funciona bien - si un usuario visita una página con "usuario" o "mi-cosas" en la ruta, cae por la ventana y se dirige a un lugar específico. Si el usuario va a cualquier otra URL, va a mi lógica de enrutamiento.

Mi pregunta es más acerca de la legibilidad: ¿hay alguna forma de que pueda hacer coincidir la ruta con algo otro que una expresión regular? ¿Hay alguna manera de proporcionar una variedad de términos para hacer coincidir? Además, ¿hay alguna manera de unir segmentos específicos de la ruta, a diferencia de todo?

Obviamente Rails tiene un enrutamiento integrado, pero este proyecto requiere que, para ciertas rutas, el controlador no esté presente en la URL. Por lo tanto, el catch-all.

Gracias por cualquier ayuda

Aquí está el archivo de rutas actualizados por la respuesta a continuación:

class RouteConstraint 
    RESERVED_ROUTES = ['users', 'my-stuff'] 

    def matches?(request) 
    !RESERVED_ROUTES.map {|r| request.path.include?(r)}.empty? 
    end 
end 

App::Application.routes.draw do 
    resources :categories 
    resources :sites 

    match '*path' => 'router#routing', :constraints => RouteConstraint.new 

    devise_for :users, :path_names =>{ :sign_in => 'login', :sign_out => 'logout', :registration => 'register' } 
    root :to => "router#routing" 
end 

Respuesta

6

Usted puede utilizar una clase para especificar las restricciones si quieres algo más limpio una vez que tenga múltiples rutas a probar:

class MyConstraint 
    BYPASSED_ROUTES = ['users', 'my-stuff'] 

    def matches?(request) 
    BYPASSED_ROUTES.map {|r| request.path.include?(r)} .empty? 
    end 
end 

TwitterClone::Application.routes.draw do 
    match "*path" => "router#routing", :constraints => MyConstraint.new 
end 

Este ejemplo es una adaptación del rails routing guide.

+0

Esto se acerca, pero ahora, en lugar de eludir las "rutas ocultas" enumeradas, la lógica intenta alimentarlas al controlador de enrutamiento. Si elimino el bang o el .empty? llamar en el método de coincidencias, la lógica funciona para palabras reservadas, pero no para todo lo demás. Lo siento, mi comprensión de lambdas es bastante limitada. –

+0

Ah, he entendido mal tu pregunta, mi lógica era exactamente la contraria a la tuya. ¿Podría publicar un poco más de sus archivos de rutas para ver cómo encaja todo eso? –

+0

Bien, he agregado las rutas actuales a mi pregunta anterior. –

0

Se trata de tomar una lambda; puedes usar los criterios que quieras.