Rails 3: Umlauts (или другой Unicode) в маршрутах - PullRequest
2 голосов
/ 25 октября 2011

У меня такой же вопрос, как и 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.

1 Ответ

1 голос
/ 25 октября 2011

Используйте свою первую идею с CGI.escape("bonitätsauskunft").downcase

Будет работать с любым браузером. Это зависит не от кодировки браузера, а от кодировки SERVER. При использовании другого сервера (webrick) маршруты могут нуждаться в изменении.

В течение некоторого времени я успешно использую этот тип «юникодных» маршрутов, и это действительно имеет хороший SEO-эффект.

...