2011-06-10 48 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