Привет хабражители, пишу проект на RoR 3.2.6 и столкнулся с проблемой: при попытке сделать запрос к серверу с русским url-ом, сервер отвечает вот это:
Как видно из скриншота, ruby использую 1.9.3.
В логах ничего дельного нету.
Поиск в гугле показал, что у Ruby >= 1.9.2 проблемы с русской кодировкой, но никакой из приведенных решений не помогло.
UPD: Запроса совсем не происходит, сервер сразу обрывает соединение.
Временный костыль: Передавать параметр с помощью /?name=русский_текст (странно, но это он в силах обработать)
UPD:MacBook-Pro-Dmitrij:TwiSup dmsilaev$ LANG="ru_RU.utf8" rails s<br>
/Users/dmsilaev/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.6/lib/rails/engine.rb:365:in `sub': invalid byte sequence in US-ASCII (ArgumentError)<br>
from /Users/dmsilaev/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.6/lib/rails/engine.rb:365:in `block in inherited'<br>
from /Users/dmsilaev/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.6/lib/rails/engine.rb:365:in `map'<br>
Решение:Переустановив ruby, rails, все гемы — проблема не решилась. Решил посмотреть туда, где была вызвана ошибка:
[2012-07-30 10:46:52] ERROR Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT<br>
/Users/dmsilaev/.rvm/gems/ruby-1.9.2-p320/gems/actionpack-3.2.7/lib/action_dispatch/middleware/static.rb:14:in `join'<br>
Посмотрев в файл, на 14 строчку, я обнаружил вот такой метод
def match?(path)<br>
path = path.dup<br><br>
full_path = path.empty? ? @root : File.join(@root, escape_glob_chars(unescape_path(path))) #14 line<br>
paths = "#{full_path}#{ext}"<br><br>
matches = Dir[paths]<br>
match = matches.detect { |m| File.file?(m) }<br>
if match<br>
match.sub!(@compiled_root, '')<br>
::Rack::Utils.escape(match)<br>
end<br>
end<br>
Посмотрев ниже в файл, нашел метод escape_glob_chars:
def escape_glob_chars(path)<br>
path.force_encoding('binary') if path.respond_to? :force_encoding<br>
path.gsub(/[*?{}\[\]]/, "\\\\\\&")<br>
end<br>
И поменяв «binary» на «utf-8» проблема решилаcь.
Надеюсь кому-нибудь из столкнувшихся с той же проблемой я помогу.