Задать вопрос

Почему Rails не хочет брать русские буквы в URL?

Привет хабражители, пишу проект на RoR 3.2.6 и столкнулся с проблемой: при попытке сделать запрос к серверу с русским url-ом, сервер отвечает вот это:

486da718c70ee7b89e719df9fa4a8b1d.png

Как видно из скриншота, 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ь.



Надеюсь кому-нибудь из столкнувшихся с той же проблемой я помогу.
  • Вопрос задан
  • 6527 просмотров
Подписаться 7 Оценить Комментировать
Решения вопроса 1
@Silaev Автор вопроса
Решение: Переустановив ruby, rails, все гемы — проблема не решилась. Решил посмотреть туда, где была вызвана ошибка:
[2012-07-30 10:46:52] ERROR Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT
    /Users/dmsilaev/.rvm/gems/ruby-1.9.2-p320/gems/actionpack-3.2.7/lib/action_dispatch/middleware/static.rb:14:in `join'


Посмотрев в файл, на 14 строчку, я обнаружил вот такой метод
  def match?(path)
      path = path.dup

      full_path = path.empty? ? @root : File.join(@root, escape_glob_chars(unescape_path(path))) #14 line
      paths = "#{full_path}#{ext}"

      matches = Dir[paths]
      match = matches.detect { |m| File.file?(m) }
      if match
        match.sub!(@compiled_root, '')
        ::Rack::Utils.escape(match)
      end
    end


Посмотрев ниже в файл, нашел метод escape_glob_chars:
def escape_glob_chars(path)
      path.force_encoding('binary') if path.respond_to? :force_encoding
      path.gsub(/[*?{}\[\]]/, "\\\\\\&")
    end


И поменяв «binary» на «utf-8» проблема решилаcь.

Надеюсь кому-нибудь из столкнувшихся с той же проблемой я помогу.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
sl_bug
@sl_bug
Encoding.default_external = Encoding::UTF_8
Encoding.default_internal = Encoding::UTF_8


в config/environment.rb
Ответ написан
sdevalex
@sdevalex
Уверены, что маршрут правильно написали правильно написали?
match 'tags/:tags' => 'articles#index'


В контроллере для теста…
class ArticlesController < ApplicationController
  def index
    render json: { data: params[:tags] }
  end
end


Rails 3.2.7 и Ruby 1.9.3p125
Ответ написан
@Mox
Team Lead, RoR, React/React Native
Попробуйте поставить gem magic_encoding и запустить скрипт magic_encoding в каталоге проекта.
Он добавит utf-8 комменты в файлы классов. Может быть в этом дело?
Ответ написан
@idem2n
Не припомню подобных проблем. Специально создал новый проект на rails 3.2.7 для теста и проверил работу под linux (ubuntu 12.04) и mac os x (10.6.8) — все отлично и там, и там.
В логе:
Started GET "/tags/%D0%B0%D0%B1%D0%B2%D0%B3%D0%B4" for 127.0.0.1 at 2012-07-29 23:03:15 +0700 Connecting to database specified by database.yml Processing by TagsController#tags as HTML Parameters: {"name"=>"абвгд"}
В браузере:
{"data":"\u0430\u0431\u0432\u0433\u0434"}

Можно попытаться использовать не webrick, а thin — пропишите в gemfile'е и стартуйте по rails s thin
Ответ написан
@Silaev Автор вопроса
Тоже, видимо рельсы криво совсем встали. Хотя все равно не понимаю почему так
MacBook-Pro-Dmitrij:TwiSup dmsilaev$ LANG="en_US.utf8" rails s
/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)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы