Условное кэширование страниц [Решение: условное фрагментарное кэширование] - PullRequest
7 голосов
/ 30 мая 2011

Предположим, что у меня есть контроллер home_controller.rb с действием index.

Я хочу кэшировать страницу индекса, поэтому я делаю:

caches_page :index

, но хочу, чтобы он кэшировал толькодля пользователей, которые не вошли в систему. Если я сделаю условный запрос, например:

caches_page :index, :if => :user_not_signed_in?

Страница будет кэширована, пока не войдет первый не авторизованный пользователь.Теперь каждый вошедший в систему пользователь также видит незарегистрированный контент.Есть ли способ отделить это действие без изменения URL?

Ответы [ 3 ]

6 голосов
/ 30 мая 2011

То, что вы хотите, не может быть достигнуто;

Страница кэшируется или не кэшируется.Процесс проверяет существование html-файла или обрабатывает его.

Тем не менее у вас есть две альтернативы:

  • использовать кэширование действий или фрагментное кэширование (не рекомендуется)

  • больше рекомендуется: загрузить специфичную для пользователя деталь с помощью ajax, чтобы вы всегда кэшировали только одну страницу и динамически вставляли конкретные данные (например, stackoverflow)

Здесьэто современные объяснения: http://railslab.newrelic.com/scaling-rails

3 голосов
/ 02 июня 2013

Принятый ответ устарел, поскольку в Rails 4 теперь доступно условное кэширование. запрос на получение был объединен в 4.0.0rc1 , что позволяет :if и:unless параметров для передачи на cache.Это позволяет шаблонам быть СУХИМЫМИ, поскольку больше нет необходимости дублировать условно кэшированный блок.

Использование:

<% cache [ @user, 'form' ], :unless => @user.changed? do %>
  <%= render partial: 'shared/error_messages', locals: {instance: @user} %>
  <%= form_for @user do |f| %>
    <div class="field">
      <div><%= f.label :name %></div>
      <div><%= f.text_field :name %></div>
    </div>
    <div class="actions">
      <%= f.submit %>
    </div>
  <% end %>
<% end %>
2 голосов
/ 08 ноября 2016

cache_if и cache_unless представляется правильным способом сделать это сейчас:

cache_if(condition, name = {}, options = nil, &block)
cache_unless(condition, name = {}, options = nil, &block)

Ваш код:

<% cache_unless @user.changed?, [ @user, 'form' ] do %>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...