【发布时间】:2011-10-25 09:54:32
【问题描述】:
我有一个与Ruby on Rails. Unicode routes 类似的问题,但标记为在那里工作的答案对我不起作用。
我想为包含变音符号 (ä) 的登录页面设置基本路径。出于 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,而不是像 Firefox 发送的 c3 和 a4。
所以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。
难道没有一种正常且简单的方法可以做到这一点吗?我真的认为 Rails 3 现在国际化会更好。
Rails 3.0.10、Ruby 1.9.2、Apache2 和乘客 3.0.7。
【问题讨论】:
标签: ruby-on-rails unicode routes diacritics