2011-10-25 44 views
2

我有一个类似的问题Ruby on Rails. Unicode routes但标记为在那里工作的答案不适用于我。路径3:变路由器(或其他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,而不是像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。

难道没有一个正常和简单的方法来做到这一点?到目前为止,我真的认为第3版的国际化会更好。

Rails 3.0.10,Ruby 1.9.2,Apache2与乘客3.0.7。

回答

1

用你的第一个想法与CGI.escape("bonitätsauskunft").downcase

它将与任何浏览器上运行。它不依赖于浏览器编码,而是依赖于SERVER编码。当您使用另一台服务器(webrick)时,路线可能需要更改。

我使用这种类型的“unicode”路线成功了一段时间,它确实有很好的SEO效果。

+0

也许两者都可以肯定吗? get CGI.escape(“neugründungen”)。downcase =>“landing_pages#startups”,:as =>:lp_startups get CGI.escape(“neugründungen”)=>“landing_pages#startups” – Jan