2010-02-18 9 views
9

I percorsi in Ruby on Rails fanno distinzione tra maiuscole e minuscole. Sembra che qualcuno l'abbia portato prima e che sia stato etichettato non risolverà.Rails Rails - Come renderli maiuscole e minuscole?

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

che mi colpisce come un peccato, come io non vedo alcun rialzo da sola domanda di percorsi di essere maiuscole e minuscole, mentre verso il basso crea una possibilità di confusione e un aspetto generale di mancanza di smalto secondo me.

Qual è il modo migliore per rendere i miei percorsi maiuscole e minuscole?

ho trovato questa punta su una ricerca di Google:

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

Questo è intelligente, ma lascia ancora la parte web_feeds del caso URL sensibili. Non vedo alcun modo simile intorno a questo, tuttavia, senza entrare in ogni possibile combinazione di wEb_feEds manualmente, ma questa è ovviamente una soluzione orribile per qualsiasi numero di ragioni.

risposta

7

ho appena ha lo stesso problema, e risolto utilizzando il middleware - date un'occhiata qui:

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

Nota: Questo vale solo per Rails 2.3+

  • Carsten
+0

La soluzione di cui sopra non ha funzionato per Rails 3, ma l'ho risolto ora. –

+0

Finalmente l'ho trasformato in un gioiello, quindi è molto più semplice da usare: https://rubygems.org/gems/route_downcaser –

+0

Questa soluzione è probabile se si hanno alcuni asset/nome di immagini in Mixed Case. Ad esempio, se stai già utilizzando un'immagine da assets/images/ABc_xyZZ.png (Mixed Case), dopo aver usato questa soluzione, cercherà di localizzare un'immagine su assets/images/abc_xyzz.png (Lower Case) e il server risponderà con 404 non trovato. –

11

I percorsi in Rails fanno distinzione tra maiuscole e minuscole poiché gli URL fanno distinzione tra maiuscole e minuscole. Dalle W3C:

URL in generale sono (con l'eccezione dei nomi delle macchine) maiuscole e minuscole. Potrebbero esserci URL, o parti di URL, in cui il caso non ha importanza, ma l'identificazione di questi potrebbe non essere semplice. Gli utenti devono sempre considerare che gli URL fanno distinzione tra maiuscole e minuscole.

+0

Interessante, non lo sapeva. – Davy8

+0

Penso che se il Web fosse iniziato su Windows, potrebbe non essersi rivelato in questo modo! –

+17

Apprezzo il fatto che ci sono momenti in cui è importante essere in grado di differenziare il caso (anche se francamente le uniche istanze che posso pensare sono casi angolari), ma per l'uso normale, questo è contrario alle aspettative degli utenti. Gli utenti si aspettano che stackoverflow.com/questions sia uguale a stackoverflow.com/Questions e, in effetti, questo è il caso. E non sono sicuro che gli utenti ordinari non prenderanno il consiglio del W3C che "dovrebbero sempre considerare che gli URL sono case sensitive". –

3

Bene si potrebbe provare un altro approccio. Fai in modo che la custodia si trasformi da server e mandi tutto in un binario.

Penso che sia possibile ottenere questo con mod_rewrite o mod_spelling.

0

Anche se gli URL fanno distinzione tra maiuscole e minuscole, se si desidera rendere i percorsi non sensibili alla distinzione tra maiuscole e minuscole, è possibile eseguire una modifica incisiva.

In application_controller.rb put:

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

Ma in realtà non farlo. Si crea un ciclo di reindirizzamento per tutte le rotte inesistenti. Dovresti davvero analizzare request.request_uri nei suoi componenti, ridimensionarli e usarli per generare la rotta legit a cui ti stai reindirizzando. Come ho detto subito, questo è un trucco sporco. Tuttavia, penso che sia meglio che rendere la tua rotta brutta e hackerata.

+3

Si dovrebbe verificare se è già downcased, qualcosa come se request.url! = Request.url.downcase redirect_to request.url.downcase altro # 404 rendono file di fine – vise

2

solo per la patch di scimmia da scartare per impostazione predefinita.semplice esempio:

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

Come afferma il W3C, Gli URL sono sensibili al maiuscolo/minuscolo –

2

Una soluzione semplice è, non può essere un modo elegante, ma ancora praticabile è: Utilizzare un before_filter nel controllore domanda come questa.

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 

Come ho già detto che non è un voto elegante ma ancora lavorabile, quindi non giù per favore. : P

+0

È meglio farlo in Rack. Nel controller dell'applicazione è già passato dal dispatcher di route di Rails. –

Problemi correlati