Обходной путь для content_for использования в сочетании с кешированием фрагментов

Я пытаюсь вставить контент в заголовок своей страницы для каждого элемента, поэтому я хотел бы указать что-то вроде этого в частичном:

# _partial.html.erb
<%= content_for :style %>
  .element {
    background-color: red;
  }
<% end %>

И поместите это в начало моей страницы:

# application.html.erb
<head>
  <style>
    <%= content_for(:style) %>
  </style>
</head>

Но частичные элементы элемента кэшируются фрагментом, content_for игнорируется в кешах.

В документации Rails сказано, что content_for не будет работать с рабочими элементами, кэшируемыми фрагментами:

WARNING: content_for is ignored in caches. So you shouldn't use it for elements that will be fragment cached. http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for

Есть ли в настоящее время способ заставить content_for работать с кешированием фрагментов в Rails 5.1? Кажется, какое-то время никто особо не касался этого вопроса. Кто-нибудь знает, есть ли причина, почему?


Здесь есть несколько более старых упоминаний:

Есть ли обходной путь для игнорируемых блоков content_for с caches_action и: layout = ›false?

content_for работает в разработке, но не в производстве?

https://gist.github.com/stackng/891895

https://rails.lighthouseapp.com/projects/8994/tickets/3409-content_for-and-fragment-caching


person orangemilktea    schedule 20.07.2018    source источник


Ответы (2)


Есть ли в настоящее время способ заставить content_for работать с кешированием фрагментов в Rails 5.1?

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

Кажется, какое-то время никто особо не касался этого вопроса. Кто-нибудь знает, есть ли причина, почему?

Похоже, что проблема просто выпала из поля зрения много лет назад: я вообще не вижу соответствующего PR в GitHub. (На самом деле у меня есть заметка об этом в моем личном списке дел, но я понятия не имел, над чем раньше работали.)

Нет, нет причин, по которым эта функция не была реализована (если причина была 8 лет назад, она потеряна в песках времени и в любом случае может больше не применяться). Если кто-то заинтересован в пиаре: пожалуйста.

person matthewd    schedule 20.07.2018

Сейчас для этого открыт пул-реквест Rails: https://github.com/rails/rails/pull/39600

Надеюсь, это скоро будет "просто работать" в Rails ... ????

Отказ от ответственности: я отправил этот запрос на перенос

person Tyler Rick    schedule 11.06.2020