Rails 3 маршрута, Yaml и экранирование UTF-8

#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