Использование after_filter в Ruby on Rails

July 27, 2009 ActionController Ruby on Rails

Есть такая штука в ActionController – after_filter. Судя по гуглу, его используют раз в пять реже, чем before_filter. Тем не менее, с after_filter тоже можно делать всякие интересные штуки – над результатом работы приложения. Например:

Заставляем браузер выдать диалог загрузки вместо отображения страницы:

def please_download_this
  headers['Content-type'] = 'application/octet-stream'
end

Меняем кодировку выдачи «на лету» (нужно было для скармливания xml одному аггрегатору, это гораздо удобнее чем перекодировать отдельно каждое поле):

def this_xml_needs_to_be_in_cp1251
  response.charset = 'cp1251'
  response.body = Iconv.conv('cp1251//IGNORE//TRANSLIT','UTF-8',response.body)
end

Выполняем минификацию (опасная штука, если пробелы имеют значение, зато подойдет в контексте CSS и Javascript)

def minify_this
  response.body = response.body.gsub!(/\s+/m,' ')
end

Кешируем содержимое страницы в статику (да, лучше это делать не в public, чтоб не спутать кеш с обычной статикой):

def cache_this
  File::open("#{RAILS_ROOT}/public#{request_uri}",'w') do |f|
    f.write response.body
  end
end

А еще можно заворачивать контент в какой-то хитрый контейнер, можно его шифровать, валидировать, можно даже выполнять операции над DOM-моделью, если так хочется (hpricot в помощь). Удачи!

Buy Me a Coffee at ko-fi.com