Кэширование страниц Rails и флеш-сообщения - PullRequest
10 голосов
/ 26 февраля 2010

Я почти уверен, что могу кэшировать страницы в подавляющем большинстве моего сайта, но одна вещь, которая мешает мне сделать это, заключается в том, что мои флеш-сообщения не будут отображаться или будут отображаться в неподходящее время.

Одна вещь, которую я рассматриваю, - это записать флэш-сообщение в файл cookie, прочитать его и отобразить с помощью javascript, а также очистить файл cookie после отображения сообщения. У кого-нибудь был такой успех или есть лучшие методы?

Спасибо.

Ответы [ 7 ]

7 голосов
/ 02 марта 2011

Кэшируемая флэш-память делает это:

в вашем контроллере приложения:

after_filter :write_flash_to_cookie


def write_flash_to_cookie
    cookie_flash = cookies['flash'] ? JSON.parse(cookies['flash']) : {}

    flash.each do |key, value|
        if cookie_flash[key.to_s].blank?
            cookie_flash[key.to_s] = value
        else
            cookie_flash[key.to_s] << "<br/>#{value}"
        end
     end

    cookies['flash'] = cookie_flash.to_json
    flash.clear
end

, а затем прочитайте «flash» cookie через Javascript и вставьте сообщение в HTML

4 голосов
/ 22 мая 2010

Я имею дело с той же проблемой, и нашел cacheable-flash плагин, который делает именно то, что KJF описал в вопросе.

Я думаю, что это более простое и приятное решение, чем чрезмерные вызовы ajax.

2 голосов
/ 26 февраля 2010

Одним из решений было бы кэширование страницы, но включив фрагмент кода javascript, который сделает еще один небольшой запрос только для раздела, для которого вы хотите быть динамическим. Таким образом, пользователь полностью загрузит страницу, а затем, когда javascript будет выполнен, он опустит динамический элемент страницы.

Некоторое время назад я написал короткую запись в блоге. http://chase.ratchetsoftware.com/2008/12/rails-caching-dynamic-fragments/

Кроме того, Грег Поллак из RailsEnvy сделал скринкаст, в котором он сосредоточился на хранении динамических данных на кэшированных страницах. http://railslab.newrelic.com/2009/02/05/episode-5-advanced-page-caching

Надеюсь, это поможет,

Чейз Грей

0 голосов
/ 12 октября 2012

Ненавязчивая Flash помещает флэш-сообщение в cookie и отображает его с помощью JavaScript. Он обеспечивает ванильный и Bootstrap JS дисплей логики. Работает в обычных и ajax-запросах. Также легко подключиться к таким фреймворкам, как AngularJS.

0 голосов
/ 17 августа 2012

Старый вопрос ... но я справился с этим, включив флэш-сообщение в ключ кеша.

caches_action :show, cache_path: proc { |c|
  most_recent_update_time = MyClass.order('updated_at DESC').limit(1).first.try(:updated_at).to_i
  { tag: most_recent_update_time.to_s + c.flash.collect{|x| x}.join }
}

Если у вас есть флеш-сообщения в вашем шоу-действии, это, очевидно, часто ломает кеш, но работает хорошо, если вы не делаете много сообщений.

0 голосов
/ 10 июля 2010

Я не использую Rails, но вот как я это сделал в Python, используя UUID:

# set flash messages like this
def flash(self, title, body):
  session['flash_messages'].append({
    'title': title,
    'body': body,
    'uuid': uuid().hex  # stores a UUID as a string
  })

...

self.flash('foo', 'bar')

Тогда в базовом шаблоне у меня это:

<script type="text/javascript">
  {% for m in session.flash_messages %}
    if(!Cookies.get('{{m.uuid}}')) {
      Notify('{{m.title}}', '{{m.body}}');
      Cookie.set('{{m.uuid}}', 'true', 86400); // key, value, expiry seconds
    }
  {% endfor %}
</script>

Я разобью это для Python-оспариваемых:

  1. Когда вы добавляете флэш-сообщение, вы создаете уникальный идентификатор и сохраняете его вместе с этим сообщением.
  2. Перед отображением сообщения вы проверяете, установлен ли файл cookie с уникальным идентификатором сообщения.
  3. Если этот файл cookie не был установлен, высветите сообщение и установите файл cookie. Срок действия файла cookie истекает через день или настолько коротким, насколько вы думаете.

Теперь, если эта страница будет извлечена из кэша, все будет в порядке. На шаге 2 тест для cookie пройдет, потому что он уже был установлен, и сообщение не будет отображаться.

0 голосов
/ 26 февраля 2010

Вам не нужно кэшировать всю страницу. Попробуйте кеширование фрагментов API

...