Несмотря на тот факт, что на дворе уже Rails версии 2.1, в рельсах до сих пор присутствует косяк, который портит кровь русскоязычным (и прочим) веб-мастерам. Точнее, это косяк не в рельсах как таковых, а в библиотеке Builder, которую рельсы используют для генерации XML-документов. Проявляется он в том, что если вы генерируете документ с кириллическими символами, то на выходе вы получаете текст, закодированный в xml entities. Выглядит вот так:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>&#1042;&#1089;&#1077; &#1076;&#1086;&#1084;&#1072; - &#1044;&#1086;&#1084;&#1072; 2.0</title>
    <link>http://doma20.ru/houses.rss</link>
    <description>&#1042;&#1089;&#1077; &#1076;&#1086;&#1084;&#1072; - &#1044;&#1086;&#1084;&#1072; 2.0 - &#1057;&#1072;&#1081;&#1090; </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 - я вас отблагодарю ссылочкой в этом блоге :)