У меня такой же вопрос, как и Ruby on Rails. Unicode-маршруты , но ответ, помеченный как работающий там, у меня не работает.
Я хочу иметь базовый маршрут для целевой страницы, содержащей умлаут (ä). Это должно быть точно так же для целей SEO.
# encoding: UTF-8
Udb::Application.routes.draw do
get "bonitätsauskunft" => "landing_pages#credit_reference", :as => :lp_credit_reference
Когда я ввожу http://localhost/bonitätsauskunft
в своем браузере, я получаю ошибку маршрутизации No route matches "/bonit%c3%a4tsauskunft"
. Таким образом, строка запроса не экранируется перед сопоставлением с маршрутом, что я считаю плохим, поскольку существует несколько способов кодирования умляутов в URL, и я не могу знать, какой из них использует браузер.
например CGI.escape("bonitätsauskunft") # => "bonit%C3%A4tsauskunft"
, обратите внимание на заглавные буквы C3 и A4 вместо c3 и a4, как отправляет Firefox.
То есть get CGI.escape("bonitätsauskunft")
и Rack::Utils.escape("bonitätsauskunft")
не совпадают.
Я тоже безуспешно пытался:
get ":page" => "landing_pages#credit_reference", :as => :lp_credit_reference, :page => /bonitätsauskunft/
get ":page" => "landing_pages#credit_reference", :as => :lp_credit_reference, :constraints => {:page => /bonitätsauskunft/}
Единственное, что работает для меня, это неловко:
# encoding: UTF-8
class UmlautConstraint
def initialize(page)
@page = page
end
def matches?(request)
request.params[:page] == @page
end
end
Udb::Application.routes.draw do
get ":page" => "landing_pages#credit_reference", :constraints => UmlautConstraint.new("bonitätsauskunft")
get "bonitätsauskunft" => "landing_pages#credit_reference", :as => :lp_credit_reference
Второй маршрут, конечно, необходим, чтобы я мог использовать именованный маршрут для создания ссылок, таких как link_to("Bonitätsauskunft", :lp_credit_reference)
, потому что Rails не знал бы, как удовлетворить UmlautConstraint.
Нет ли нормального и простого способа сделать это? Я действительно думал, что рельсы 3 будут лучше с интернационализацией.
Rails 3.0.10, Ruby 1.9.2, Apache2 с пассажиром 3.0.7.