Как мне использовать UTF в Rails URL? - PullRequest
2 голосов
/ 12 января 2010

У меня есть следующий маршрут в routes.rb:

map.resources 'protégés', :controller => 'Proteges', :only => [:index]
#
# this version doesn't work any better:
# map.resources 'proteges', :as => 'protégés', :only => [:index]

Когда я перехожу к «http://localhost:3000/protégés», я получаю следующее:

No route matches "/prot%C3%A9g%C3%A9s" with {:method=>:get}

Я подумал, что HTTP-сервер, который я использовал (Mongrel), не работал должным образом Я также попробовал Apache с Passenger безрезультатно. Я попытался добавить промежуточное программное обеспечение Rack:

require 'cgi'

class UtfUrlMiddleware

  def initialize(app)
    @app = app
  end

  def call(env)
    request = Rack::Request.new(env)
    puts "before: #{request.path_info}"
    if request.path_info =~ /%[0-9a-fA-F]/
      request.path_info = CGI.unescape(request.path_info)
    end
    puts "after:  #{request.path_info}"
    @app.call(env)
  end

end

В логах вижу правильную информацию:

before: /prot%C3%A9g%C3%A9s
after:  /protégés

но я все еще вижу ту же ошибку "Нет совпадений маршрутов".

Как мне убедить Rails использовать интернационализированный маршрут? Я на Rails 2.3.5 за то, что он стоит.

1 Ответ

1 голос
/ 12 января 2010

Проблема в том, что Rails использует переменную окружения "REQUEST_URI". Таким образом, следующие работы:

# in UtfUrlMiddleware:
def call(env)
  if env['REQUEST_URI'] =~ /%[0-9a-fA-F]/
    env['REQUEST_URI'] = CGI.unescape(env['REQUEST_URI'])
  end
  @app.call(env)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...