Rails Кэшированный частичный в макете отображается дважды - PullRequest
1 голос
/ 02 сентября 2011

Я пытаюсь кэшировать часть, которая отображается в макете. Это частичное вычислительно дорого, поэтому я хочу вычислить его только один раз. Это не зависит от контроллера, поэтому обычное кэширование фрагментов, кажется, не применяется. Вместо этого я решил использовать Rails.cache.fetch ('menu') для кеширования. Вот как выглядит содержимое части.

<% Rails.cache.fetch('menu') do %>
  Partial code...
<% end %>

Но когда я делаю это, он визуализирует частичное дважды. По какой-то причине он перестал делать это в моей среде разработки, поэтому я решил попробовать и развернуть его. Мне не так повезло с моей производственной средой. Сам партиал генерирует меню, которое включает ссылки на множество записей на сайте, чтобы помочь улучшить навигацию.

Первоначально я пытался поместить оператор кэша в файл макета, но затем он дважды отображал макет.

Я недавно добавил хакер jQuery для удаления дубликата html, чтобы он вроде как "работал", но я бы предпочел, чтобы он работал правильно. Я не хочу вдаваться в проблемы при установке какой-то сложной системы кэширования, такой как Redis, для которой мне нужно запустить другую серверную программу. Это было бы излишним для этой задачи. В рельсах должно быть что-то, что хорошо подходит для кэширования частей макетов.

Должен ли я попробовать что-то совершенно другое или это ошибка в рельсах? Если это ошибка, то есть ли обходной путь, который я могу использовать?

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Я понял это.Вместо того, чтобы кэшировать частичное в представлении, я создал вспомогательный метод, который возвращает обработанное частичное.

#Returns a menu for the application layout
def menu
  Rails.cache.fetch('menu') { render :partial => 'all/menu' }
end

Тогда все, что мне нужно в макете, - это строка <% menu%>

0 голосов
/ 02 сентября 2011

Попробуйте очистить производственный кеш.Скорее всего, у вас была логическая ошибка, из-за которой он отображался дважды.В разработке кеш обычно отключается, поэтому, когда вы исправили проблему, она исчезла в процессе разработки.Если вы повторно внедрили, проблема, вероятно, исчезла и из производственного кода, но если кэш не был очищен, он продолжит отображать кешированную логическую ошибку.

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