Кэширование страниц Rails и флэш-сообщения
Я уверен, что могу кэшировать страницы подавляющего большинства моего сайта, но единственное, что мешает мне сделать это, что мои флэш-сообщения не будут отображаться, или они будут отображаться в неправильное время.
одна вещь, которую я рассматриваю, - это запись флэш-сообщения в файл cookie, его чтение и отображение с помощью javascript и очистка файла cookie после отображения сообщения. Кто-нибудь добился успеха в этом или есть лучшие методы?
спасибо.
7 ответов
одним из решений было бы кэшировать страницу, но включить фрагмент 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
надеюсь, это поможет,
Чейз Серый
Кэшируемая флэш-этого:
в контроллере приложения:
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
Я имею дело с той же проблемой, и я нашел cacheable-flash плагин, который делает именно то, что kjf описал в вопросе.
Я думаю, что это более простое и приятное решение, чем делать чрезмерные вызовы ajax.
вам не нужно кэшировать всю страницу. Попробуйте кэширование фрагментов API
старый вопрос... но я обошел это, включив флэш-сообщение в свой ключ кэша.
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 }
}
Если у вас есть flash-сообщения на вашем шоу-действии, это, очевидно, часто нарушает кэш, но хорошо работает, если вы не делаете много сообщений.
Ненавязчивые Флэш помещает flash-сообщение в cookie и отображает его через JavaScript. Он обеспечивает ваниль и Bootstrap ароматизированные логики отображения JS. Он работает в обычных и ajax-запросах. Также легко зацепиться за рамки, такие как AngularJS.
Я не использую Rails, но вот как я это сделал в Python, используя UUIDs:
# 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-challenged:
- когда вы добавляете сообщение, вы создаете уникальный идентификатор и хранить его с этим сообщением.
- перед отображением сообщения проверьте, установлен ли файл cookie с уникальным идентификатором сообщения.
- если этот cookie не имеет был установлен, флэш-сообщение и установить cookie. Срок действия файла cookie истекает через день или так быстро, как вы считаете разумным.
теперь, если эта страница вытащена из кэша, все будет в порядке. На Шаге 2 тест для cookie пройдет, потому что он уже установлен, и сообщение не будет отображаться.