#ruby-on-rails #ruby #ruby-on-rails-3 #utf-8
#ruby-on-rails #ruby #ruby-on-rails-3 #utf-8
Вопрос:
У меня проблема, которая проверяет мое здравомыслие. В моем приложении rails я загружаю экранированную строку UTF-8 из файла перевода I18n для использования в маршрутах моего приложения. Однако rails не отменяет экранирование строки при использовании в маршрутизации. Вот мой файл перевода:
---
ru:
activerecord:
models:
item:
other: "xD0xA2xD0xBExD0xB2xD0xB0xD1x80xD1x8B" # UTF-8 escaped version of "Товары". (to_yaml is doing the escaping btw)
И вот моя конфигурация / routes.rb
match "/#{Item.model_name.human(:count => :other).downcase}" => "items#index"
Однако при переходе к этому маршруту я получаю:
Routing Error
No route matches "/Товары"
Если UTF-8 сохраняется в файле перевода без экранирования, все работает нормально. to_yaml экранирует строку и вызывает проблему. Есть ли какой-либо способ заставить yaml сохранить исходную строку?
Кстати, я использую Rails 3.0.7, Ruby 1.9.2. Спасибо, ребята!
Ответ №1:
Похоже, что это правильно экранировано для YAML, но это не относится к UTF-8. Это просто экранирование строки Ruby и может использоваться для любой кодировки символов, из которых UTF-8 является только одной.
То, что вы видите как ошибку, — это версия того же самого, экранированная URL.
Убедитесь, что у вас есть маршрут, правильно определенный в выходных данных rake routes
, который на основе вашей строки будет /Товары
.
Комментарии:
1. Да, рейковые маршруты выглядят неплохо:
/Товары(.:format) {:controller=>"items", :action=>"index"}
И URL-адреса, сгенерированные для этого маршрута, генерируются правильно, я получаю ошибку маршрутизации только тогда, когда я действительно делаю запрос на этот URL.
Ответ №2:
Я смог сохранить исходную строку UTF-8 без преобразования строки во внутреннюю кодировку Ruby, используя ya2yaml вместо to_yaml. Однако мне пришлось закодировать ключи и значения хэша параметров в UTF-8 (ключи кодировались как ASCII-8BIT, а значения — как UTF-8), прежде чем yaml был сгенерирован должным образом:
def utf8_hash(some_hash) # convert hash key amp; 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