2012-10-16 15 views
6

Adresy URL są (z niejasnego powodu, generują różne problemy/brak rzeczywistej przewagi) określone przez w3.Rails routes.rb - dopasowywanie wielkości liter

Jakie są moje możliwości w routes.rb nieodwracalnie dopasowane do wielkości liter?

tutaj dopasowanie:

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

Url Przykład:/Europa/library/page4711

rozmowy wykazują działanie kontrolera biblioteka z {: foo => "Europa": bar => „page4711 "}

Chcę są 2 rzeczy:

  • p Wartość aram: foo potrzebuje .downcase tak/Europa powinna być { : foo => "europe"}
  • biblioteka powinna dopasowywać wielkość liter bez względu na wielkość liter (np./Biblioteka/Biblioteka, /Library wszystkim powinien pasować)

Jak mogę to zrobić w routes.rb?

Dzięki!

+0

Może dotyczyć: http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/ –

+0

@shioyama: W końcu muszę zrobić to jako klejnot: https: // rubygems.org/gems/route_downcaser –

Odpowiedz

7

Ok, aby odpowiedzieć na moje własne pytanie:

Nie ma dobrego sposobu, aby to zrobić w ciągu Rails routes.rb.

Oto co zrobiłem:

Na pierwszą rzeczą, jaką stworzył before_filter w moim kontrolera:

before_filter :foo_to_lower_case 

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

Na drugim ja stworzył zasadę równoważenia obciążenia, aby to małe litery do aplikacji szyn . Oczywiście możesz również zdefiniować regułę nginx/apache.

Edit: Znalazłem inne rozwiązanie dla drugiej części, bo nie lubił wstępnego parsowania/wymiana każdego adresu URL.

Zrobiłem "bibliotekę" do symbolu i napisałem do niej ograniczoną, która akceptuje tylko dowolną formę słowa "biblioteka".

Więc linia w routes.rb wygląda następująco:

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

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

2

Aby downcase ścieżkę, można skonfigurować inicjatora dodać middleware Rack. Tutaj sprawdzam, czy ścieżka zaczyna się od /posts i posts nie jest częścią dłuższego słowa. Zobacz komentarze do kodu, aby uzyskać więcej informacji.

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

Wystarczy dodać do swojej Gemfile

gem 'route_downcaser' 

szyn restart, bez potrzebnej konfiguracji. github dla tego projektu jest:

https://github.com/carstengehling/route_downcaser

Jak zaznaczono w gem „kwerendy parametry i ścieżek aktywów nie są zmieniane w jakikolwiek sposób.”

+0

ładne, ale byłoby miło być bardziej konkretnym – brauliobo

+1

Ostrożnie, ten klejnot jest o wiele za łatwy w użyciu. – Shadoath

Powiązane problemy