Резервное копирование страниц и флэш-сообщений

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

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

Спасибо.

Ответ 1

Одним из решений было бы кэширование страницы, но включить фрагмент 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

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

Чейз Серый

Ответ 2

Кэшируемая вспышка делает это:

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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 }
}

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

Ответ 6

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

Ответ 7

Я не использую 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>

Я сломаю его для Pythonically-challenge:

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

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