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

27 июля 2009

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



Два комментария. Напиши еще один
  1. F3360fb509c2872419a2f05ad4ce98c2 # 28 июля 2009 ring0 написал:

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

  2. 82896ae7662ba5391678578911d5a9b4 # 20 августа 2009 mikhailov (railsgeek.com) написал:

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

(нужна разметка?)

  • **жирный**
  • > цитата

отменить