2012-10-16 3 views
6

Les URL sont (pour une raison imprécise, génèrent différents problèmes/aucun avantage réel) définies sensibles à la casse par w3.Rails routes.rb - Insensible à la casse

Quelles sont mes possibilités dans routes.rb match insensiblement?

ici la mise en correspondance:

match '/:foo/library/:bar' => 'library#show' 

Url Exemple:/Europe/bibliothèque/page4711

appels montrent l'action dans le contrôleur bibliothèque {: foo => "europe",: bar => « page4711 "}

ce que je veux sont 2 choses:

  • p valeur aram de: foo a besoin d'un .downcase si/Europe doit être { : foo => "europe"}
  • La bibliothèque doit correspondre à la casse insensible (ie./Library,/LIBRARY, /liBRarY tous doivent correspondre)

Comment faire cela dans routes.rb?

Merci!

+0

Peut-être pertinent: http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/ –

+0

@shioyama: J'ai enfin réussi à faire de ce petit bijou: https: // rubygems.org/gems/route_downcaser –

Répondre

7

Ok, pour répondre à ma propre question:

Il n'y a pas de bonne façon de le faire dans Rails routes.rb.

Voici ce que je faisais:

Pour la première chose que je créé un before_filter dans mon contrôleur:

before_filter :foo_to_lower_case 

def foo_to_lower_case 
    params[:foo] = params[:foo].downcase 
end 

Pour le second, je créé une règle d'équilibrage de charge pour l'obtenir en minuscules à l'application des rails . Bien sûr, vous pouvez également définir une règle nginx/apache.

Modifier: J'ai trouvé une autre solution pour la deuxième partie parce que je n'aimais pas le pré-parsing/remplacement de chaque URL.

Je ai fait "bibliothèque" à un symbole et a écrit un contraint pour elle qui n'accepte que toute forme du mot "bibliothèque".

Ainsi, la ligne routes.rb ressemble:

match '/:foo/:library/:bar' => 'library#show', :constraints => { :library => /library/i } 
+0

optimisation: 'params [: foo] .downcase!' – brauliobo

2

Pour downcase le chemin, vous pouvez configurer un initialiseur pour ajouter un middleware Rack. Ici, je vérifie si le chemin commence par /posts et posts ne fait pas partie d'un mot plus long. Voir les commentaires du code pour plus d'informations.

class PathModifier 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    if env['PATH_INFO'] =~ /^\/posts\b/i 
     Rails.logger.debug("modifying path") 
     %w(PATH_INFO REQUEST_URI REQUEST_PATH ORIGINAL_FULLPATH).each do |header_name| 
     # This naively downcases the entire String. You may want to split it and downcase 
     # selectively. REQUEST_URI has the full url, so be careful with modifying it. 
     env[header_name].downcase! 
     end 
    end 
    @app.call(env) 
    end 
end 
Rails.configuration.middleware.insert(0, PathModifier) 
3

ajouter ceci à votre Gemfile

gem 'route_downcaser' 

Les rails de redémarrage, aucune configuration nécessaire. le github pour ce projet est à l'adresse:

https://github.com/carstengehling/route_downcaser

Comme indiqué dans la pierre « paramètres queryString et les chemins d'actifs ne sont pas modifiés en aucune façon. »

+0

agréable, mais serait bien d'être plus précis – brauliobo

+1

Attention, cette gemme est trop facile à utiliser. – Shadoath