2012-10-16 10 views
6

Gli URL sono (per un motivo non chiaro, generano problemi diversi/nessun vantaggio reale) definiti case sensitive da w3.Rails routes.rb - Non sensibile alla distinzione tra maiuscole e minuscole

Quali sono le mie possibilità in route.rb match case in modo insensibile?

qui l'abbinamento:

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

Url Esempio:/Europe/library/page4711

chiamate mostrano azione nel controller della libreria con {: foo => "Europa",: bar => "page4711 "}

Quello che voglio sono 2 cose:

  • la p aram value of: foo needs a .downcase so/Europe dovrebbe essere { : foo => "europe"}
  • La libreria deve corrispondere senza distinzione tra maiuscole e minuscole (es./Libreria,/BIBLIOTECA, /Library tutto deve corrispondere)

Come faccio a fare questo in routes.rb?

Grazie!

+0

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

+0

@shioyama: Ho finalmente avuto modo di renderlo un gioiello: https: // rubygems.org/gems/route_downcaser ottimizzazione –

risposta

7

Ok, per rispondere alla mia domanda:

non c'è buon modo per fare questo all'interno di Rails routes.rb.

Ecco quello che ho fatto:

Per la prima cosa che ho creato un before_filter nel mio controller:

before_filter :foo_to_lower_case 

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

Per la seconda ho creato una regola di bilanciamento del carico per farlo minuscolo al app rotaie . Ovviamente puoi anche definire una regola nginx/apache.

Modifica: Ho trovato un'altra soluzione per la seconda parte perché non mi piaceva il pre-analisi/sostituzione di ogni url.

Ho creato una "libreria" per un simbolo e ne ho scritto una vincolata che accetta solo qualsiasi forma della parola "libreria".

Così la linea in routes.rb assomiglia:

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

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

2

Per downcase il percorso, è possibile impostare un inizializzatore per aggiungere un middleware rack. Qui sto controllando se il percorso inizia con /posts e posts non fa parte di una parola più lunga. Vedi i commenti del codice per maggiori informazioni.

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

Basta aggiungere questo alla vostra Gemfile

gem 'route_downcaser' 

rotaie di riavvio, nessuna configurazione necessaria. il github per questo progetto e ':

https://github.com/carstengehling/route_downcaser

Come indicato nella gemma "querystring parametri e percorsi di asset non vengono modificati in alcun modo."

+0

bello, ma sarebbe bello essere più specifico – brauliobo

+1

Attenzione, questa gemma è troppo facile da usare. – Shadoath

Problemi correlati