Резервное копирование страниц и флэш-сообщений
Я уверен, что смогу кэшировать основную часть моего сайта, но единственное, что мешает мне сделать это, это то, что мои флеш-сообщения не будут отображаться, или они будут отображаться в неподходящее время.
Одна вещь, которую я рассматриваю, - это написать флэш-сообщение в файл 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 пройдет, потому что он уже установлен, и сообщение не будет отображаться.