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

Есть такая штука в 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 в помощь). Удачи!

Комментарии

  • ring0 28 июля 2009

    Мне кажется что делать правки DOM в after_filter не совсем Ъ. Для кэширования же есть встроенные средства. Но в целом пост понравился.

  • mikhailov 20 августа 2009

    around_filter гугл так вообще забыл

Оставить комментарий

  • (или OpenID)
  •