2011-06-10 49 views
2

我遇到了一個測試我的理智的問題。在我的Rails應用程序中,我從I18n翻譯文件中加載一個轉義的UTF-8字符串,用於我的應用程序路線。但是,在路由中使用導軌時不會避免使用字符串。這是我的翻譯文件:Rails 3 Routes,Yaml&Escaping UTF-8

--- 
ru: 
    activerecord: 
    models: 
     item: 
     other: "\xD0\xA2\xD0\xBE\xD0\xB2\xD0\xB0\xD1\x80\xD1\x8B" # UTF-8 escaped version of "Товары". (to_yaml is doing the escaping btw) 

這裏導航到該路由時,是我的config/routes.rb中

match "/#{Item.model_name.human(:count => :other).downcase}" => "items#index" 

不過,我得到:

Routing Error 

No route matches "/%d0%a2%d0%be%d0%b2%d0%b0%d1%80%d1%8b" 

如果UTF-8存儲在翻譯文件中,一切正常。 to_yaml正在逃避字符串並導致問題。有沒有辦法強制yaml保留原始字符串?

順便說一句,我使用Rails 3.0.7,Ruby 1.9.2。多謝你們!

回答

1

我能夠通過使用ya2yaml而不是to_yaml來存儲原始的UTF-8字符串,而無需將字符串轉換爲Ruby內部編碼。但是,我不得不&值編碼params哈希表的鍵UTF-8(按鍵都被編碼爲ASCII-8BIT和值UTF-8)被正確生成YAML前:

def utf8_hash(some_hash) # convert hash key & values to utf-8 for proper translation 
    new_hash = Hash.new 
    some_hash.each do |key, value| 
     new_hash[key.encode(Encoding::UTF_8)] = value.to_s.encode(Encoding::UTF_8) 
    end  
    new_hash 
    end 

    utf8_hash(params).ya2yaml 
1

這似乎是正確逃脫YAML,但它不是特定於UTF-8。這只是Ruby字符串轉義,可以用於任何字符編碼,其中UTF-8只有一種。

你看到的錯誤是同一事物的URL轉義版本。

請確保您在rake routes的輸出中正確定義了一條路線,該路線根據您的字符串爲/Товары

+0

呀,耙路長相好的: ''''''''''''''''''''''''\向該網址發送請求。 – dhulihan 2011-06-10 19:22:04