2010-02-18 9 views
9

Las rutas en Ruby on Rails distinguen entre mayúsculas y minúsculas. Parece que alguien lo mencionó anteriormente, y que ha sido etiquetado no lo arreglará.Rutas de Rutas - ¿Cómo hacer que no distingan entre mayúsculas y minúsculas?

http://rails.lighthouseapp.com/projects/8994/tickets/393-routes-are-case-sensitive

Eso me parece lamentable, ya que realmente no veo ninguna boca en mi propia aplicación para las rutas entre mayúsculas y minúsculas, mientras que en el lado negativo se crea un potencial de confusión y un aspecto general falta de pulimento en mi opinión.

¿Cuál es la mejor manera de hacer que mis rutas sean insensibles a las mayúsculas y minúsculas?

me encontré con este consejo en una búsqueda de Google:

map.connect "web_feeds/:action", :controller => 'web_feeds', :action => /[a-z_]+/i 

Ésta es inteligente, pero que aún deja la parte web_feeds del caso url sensible. Sin embargo, no veo una forma similar de evitar esto sin ingresar cada combinación posible de wEb_feEds manualmente, pero obviamente es una solución horrible por varias razones.

Respuesta

7

acabo tiene el mismo problema y lo resolvió usando el middleware - echar un vistazo aquí:

http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/

Nota: Esto sólo se aplica a los carriles 2.3+

  • Carsten
+0

La solución anterior no funciona para Rails 3, pero lo he arreglado ahora. –

+0

Finalmente hice esto en una joya, por lo que es mucho más fácil de usar: https://rubygems.org/gems/route_downcaser –

+0

Esta solución es problemática si tiene algún nombre de activos/imágenes en Mixed Case. Por ejemplo, si ya está usando una imagen de assets/images/ABc_xyZZ.png (Mixed Case), luego de usar esta solución, intentará ubicar una imagen en assets/images/abc_xyzz.png (minúsculas) y el servidor responderá con 404 no encontrado. –

11

Las rutas en los rieles distinguen entre mayúsculas y minúsculas porque las URL distinguen entre mayúsculas y minúsculas. A partir de los W3C:

URLs en general son entre mayúsculas y minúsculas (con la excepción de los nombres de máquina). Puede haber URL, o partes de URL, donde el caso no importa, pero identificándolos puede no ser fácil. Los usuarios siempre deben considerar que las URL distinguen entre mayúsculas y minúsculas.

+0

Interesante, no lo sabía. – Davy8

+0

Creo que si la Web hubiera comenzado en Windows, ¡podría no haber sido así! –

+17

Aprecio el hecho de que hay momentos en los que es importante poder diferenciar entre mayúsculas y minúsculas (aunque, francamente, las únicas instancias que puedo pensar son casos de esquina), pero para el uso ordinario, esto va en contra de las expectativas del usuario. Los usuarios esperan que stackoverflow.com/questions sea lo mismo que stackoverflow.com/Questions, y de hecho, este es el caso. Y no estoy seguro de que los usuarios comunes y corrientes acepten el consejo del W3C de que "siempre deben tener en cuenta que las URL son sensibles a las mayúsculas y minúsculas". –

3

Bien, podrías probar con otro enfoque. Haga que el caso se transforme en el lado del servidor y envíe todo a los rieles en el contexto.

Creo que puede lograr esto con mod_rewrite o mod_spelling.

0

Aunque las URL distinguen entre mayúsculas y minúsculas, si desea que sus rutas no distingan entre mayúsculas y minúsculas, puede hacer un truco sucio.

En application_controller.rb puesto:

rescue_from ActionController::RoutingError do |exception| 
redirect_to request.url.downcase 
end 

Pero en realidad no hacer eso. Crea un bucle de redireccionamiento para cualquier ruta inexistente. Realmente debería analizar request.request_uri en sus componentes, descárgalos y utilícelos para generar la ruta legítima a la que redirige. Como mencioné enseguida, este es un truco sucio. Sin embargo, creo que esto es mejor que hacer su mapa de ruta feo y hackish.

+3

Debe comprobar si ya está downcased, algo así como si request.url! = Request.url.downcase redirect_to request.url.downcase demás # 404 hacen que el archivo final – vise

2

simplemente mono-parche a la caja fuerte por defecto.ejemplo sencillo:

module ActionController 
    module Caching 
    module Pages 
     def cache_page(content = nil, options = nil) 
     return unless perform_caching && caching_allowed 

     path = case options 
      when Hash 
      url_for(options.merge(:only_path => true, :skip_relative_url_root => true, :format => params[:format])) 
      when String 
      options 
      else 
      request.path 
     end 

     path = path.downcase 

     self.class.cache_page(content || response.body, path) 
     end 
    end 
    end 
end 
+0

Como los estados del W3C, Las URL distinguen entre mayúsculas y minúsculas –

2

Una solución simple es, no puede ser una manera elegante, pero aún viable es: Utilice un before_filter en su controlador aplicación como ésta.

before_filter :validate_case 

    def validate_case 
    if request.url != request.url.downcase 
     redirect_301_permanent_to request.url.downcase 
    end 
    end 

    def redirect_301_permanent_to(url) 
    redirect_to url, :status=>:moved_permanently 
    end 

Como ya he dicho que no es un elegante pero viable, por lo que no hay votos por favor. : P

+0

Es mejor hacerlo en Rack. En el controlador de la aplicación ya ha pasado por el despachador de ruta de Rails. –

Cuestiones relacionadas