Кэширование страниц Rails и флэш-сообщения

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

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

Спасибо.


person KJF    schedule 26.02.2010    source источник


Ответы (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

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

Чейз Грей

person Chase M Gray    schedule 26.02.2010
comment
Мне нравится эта идея. Кажется, это может быть билет. - person KJF; 27.02.2010
comment
Я думаю, стоит отметить, что это не позволит реализовать все преимущества кэширования страниц, потому что процесс Rails все равно будет выполняться каждый раз, а не вообще. Я не могу придумать лучшего решения, хотя. - person John Topley; 27.02.2010
comment
Кэширование фрагментов лучше, чем обслуживание второго HTTP-запроса, который запрашивает только те данные, которые могут быть включены в первый. Эта стратегия удвоит количество обслуживаемых вами HTTP-запросов. - person Jesse Dhillon; 12.07.2010

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

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

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

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

person VMOrtega    schedule 02.03.2011

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

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

person Anton Mironov    schedule 22.05.2010
comment
Я думаю, что это лучший подход для Rails. Большинство других ответов на этот вопрос предлагают создать свой собственный, но гем cacheable-flash уже решает эту проблему и решает ее хорошо. Спасибо Антону и Pivotal Labs. - person GregT; 19.09.2013

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

person Kylo    schedule 26.02.2010
comment
Может быть, он хочет закешировать всю страницу? Кэширование страниц дает наибольший прирост производительности. - person John Topley; 26.02.2010
comment
Да исправить. На данный момент я уже кэширую фрагменты, чтобы обойти проблему с флешем. - person KJF; 27.02.2010

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

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

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

person cpuguy83    schedule 16.08.2012

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

person lulalala    schedule 12.10.2012

Я не использую 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 будет пройдена, поскольку он уже был установлен, и сообщение отображаться не будет.

person Jesse Dhillon    schedule 10.07.2010