Есть ли обходной путь для игнорируемых блоков content_for с caches_action и: layout => false? - PullRequest
22 голосов
/ 18 ноября 2011

Когда вы используете caches_action :layout => false в Rails 3, все блоки content_for, которые заполняются в кэшированном представлении и используются в вашем макете, заканчиваются пустыми. Есть ли обходной путь для этого?

например. в моем приложении у меня есть следующие довольно типичные настройки.

Вспомогательный метод, вызванный из моих представлений, который устанавливает заголовок страницы:

# application_helper.rb
def page_title(title)
    content_for(:page_title) { title }
end

Строка в моем файле макета выглядит следующим образом

# application.html.erb
<head>
<title><%= yield(:page_title) %></title>
</head>

И в представлении я мог бы назвать

# index.html
<% page_title 'Hello!' %>

Конечно, если вы кэшируете свое действие с помощью :layout => false, это приводит к пустым заголовкам страниц, поскольку кэширование действий игнорирует все блоки content_for.

Нет ли обходного пути для этого? Кэширование действий с помощью :layout => false настолько близко к тому, чтобы быть чрезвычайно полезным, но этот глюк делает его довольно неловким.

Другие люди, спрашивающие или комментирующие эту же проблему:

  1. http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/d8d72f050701d44b
  2. http://www.golygon.com/2011/04/tips-and-tricks-in-ruby-on-rails/
  3. https://rails.lighthouseapp.com/projects/8994/tickets/4140-action-caching-with-caches_action-and-layout-false

И документация Rails , которая отмечает это поведение:

"ВНИМАНИЕ: content_for игнорируется в кешах. Поэтому вы не должны использовать его для элементов, которые будут кэшироваться фрагментом".

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

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

, поэтому это выглядит примерно так:

# application.html.erb
<head>
<% cache("#{request.env['PATH_INFO']}/header") do %>
    <title><%= yield(:page_title) %></title> 
<% end %>

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

0 голосов
/ 17 октября 2012

У меня была точно такая же проблема, и я использовал этот гист , и он отлично работает!

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