Undr

На память

Записи с меткой ‘actionview’

Кэширование фрагментов HTML кода в шаблонах ActionMailer

without comments

1 Star2 Stars3 Stars4 Stars5 Stars (1 голосов, средний: 5.00 из 5)
Loading ... Loading ...

Задача: реализовать кэширование фрагментов HTML кода в шаблоне письма для рассылки.

Первое решение которое приходит в голову – это использовать хелпер cache, например так:

...
<h1>Result has been executed for long time</h1>

<% cache cache_key do %>
  <div>
  <%= doing_something_long_time_and_show_result %>
  </div>
<% end %>
...

Но этот способ не работает, так как ActiveMailer не содержит методы для кэширования. И в результате у нас ошибка:

Error: ActionView::Template::Error - undefined method `perform_caching' for #<SomeMailer:0x0000010827a9f8>
  /Users/undr/.rvm/gems/ruby-1.9.2-p180/gems/actionpack-3.0.7/lib/action_view/helpers/cache_helper.rb:37:in `cache'
  ...

Второй вариант, это использовать Rails.cache.fetch:

...
<h1>Result has been executed for long time</h1>

<%= Rails.cache.fetch cache_key do %>
  <div>
  <%= doing_something_long_time_and_show_result %>
  </div>
<% end %>
...

Ошибки уже нет, но результат не верный. В кэш попадает все содержимое шаблона, а не часть в блоке, и, как следствие, в результате письмо содержит дублированные куски HTML кода. То есть сначала выводится заголовок, потом опять заголовок и содержимое блока.

Чтобы убрать дублирование HTML кода в результате, нужно написать примерно такой хелпер:

def mailer_cache key, &block
  Rails.cache.fetch(key) do
    with_output_buffer(&block)
  end
end

И в шаблоне вызывать его.

...
<h1>Result has been executed for long time</h1>

<%= mailer_cache cache_key do %>
  <div>
  <%= doing_something_long_time_and_show_result %>
  </div>
<% end %>
...

Написал undr ()

28 июня 2011 в 14:58

Исчезающие flash сообщения

without comments

1 Star2 Stars3 Stars4 Stars5 Stars (Еще не оценили)
Loading ... Loading ...

Для передачи сообщений от запроса к запросу используют flash сообщения. Чтобы организовать работу по отображению flash сообщений можно написать помощник, который будет скрывать сообщение по прошествии какого-то времени, чтобы оно не мешало.

Читать далее »

Написал undr ()

5 сентября 2009 в 19:27