Несмотря на тот факт, что на дворе уже Rails версии 2.1, в рельсах до сих пор присутствует косяк, который портит кровь русскоязычным (и прочим) веб-мастерам. Точнее, это косяк не в рельсах как таковых, а в библиотеке Builder, которую рельсы используют для генерации XML-документов. Проявляется он в том, что если вы генерируете документ с кириллическими символами, то на выходе вы получаете текст, закодированный в xml entities. Выглядит вот так:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Все дома - Дома 2.0</title>
<link>http://doma20.ru/houses.rss</link>
<description>Все дома - Дома 2.0 - Сайт </description>
...
Согласитесь, это никуда не годится. Кто его знает, как с таким XML-документом будут работать потребляющие его ридеры и конвертеры. Без косяков тут точно не обойдется.
Чтобы решить эту проблему, я в свое время откопал небольшой фикс, который добавляет кириллические символы в список разрешенных для прямого вывода, что вполне приемлимо при правильно выставленной кодировке документа. Фикс такой:
class Fixnum #:nodoc:
XChar = Builder::XChar if ! defined?(XChar)
# XML escaped version of chr (inlines cyrillic unicode range)
def xchr
n = XChar::CP1252[self] || self
n = 42 unless XChar::VALID.find {|value| value.kind_of?(Range) ? value.include?(n) : (value == n)}
XChar::PREDEFINED[n] or case n
when 0...128
n.chr
when 0x400..0x4FF
[n].pack 'U'
else
"#{n};"
end
end
end
Пакуем его в файлик xml_utf8_fix.rb и складываем в RAILS_ROOT/lib, а затем подключаем в самом конце config.rb:
require "xml_utf8_fix"
Подключили, рестартнули сервер - и проблема решена! Хоть убейте, но я не помню где взял этот код. Если вы узнали свое произведение, скиньте мне информацию о вас на rene.dekart[собако]gmail.com - я вас отблагодарю ссылочкой в этом блоге :)