2014-02-12 2 views
1

Скажем, у меня есть простое приложение со следующей планировкойКак кэшировать динамический заголовок/нижний колонтитул в приложении rails?

<html> 
<head>...</head> 
<body> 
    <%= render :partial => 'layouts/header' %> 
    <%= yield %> 
    <%= render :partial => 'layouts/footer' %> 
</body> 
</html> 

Мои колонтитулов обертоны довольно просты, но они требуют динамических данных, которые занимает несколько миллисекунд, чтобы извлечь из БД. Прямо сейчас, я получаю данные заголовка с before_action: метод в мой контроллер приложения, так как это необходимо на всех страницах через (кроме Ajax вызовов):

before_action :prepare_header 

private 
def prepare_header 
    @news = ... 
end 

Как кэшировать либо действие prepare_header или header.erb. HTML. Я использую Rails 4.0.0

Спасибо.

ответ

1

Вы можете сделать это с помощью кэширования фрагментов в представлении.

Ваша переменная @news рассчитывается на основе некоторых данных, например params[:a], params[:b] and params[:c]. Основываясь на том, что вы можете обернуть заголовок (а затем частичный) с блоком кэш

<% cache([params[:a], params[:b], params[:c], 'header']) do %> 
    you html code here 
<% end %> 

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

Хорошей практикой является добавление большего контроля в cache_key для того, чтобы привести к отмене его по требованию, как:

cache([cache_key_1, cache_key_2, version_number])

когда-то изменения вы увеличиваете VERSION_NUMBER и аннулированию соответственно!

И, конечно, параметр expires_at.

UPDATE

Для кэширования действий вы можете попробовать this gem. И передать ваш желаемый Params в параметре
if: Proc { ... }

+0

Не будет ли это кэшировать только сам вид, но метод before_action по-прежнему будет выполнять? Это то, что я пытаюсь кэшировать. Просмотр изображений для меня ничтожен, так как он вообще не попадает в базу данных, так что это довольно быстро. – Rorchackh

+0

@ Rorchackh хорошо, что вы попросили либо шаблон 'html.erb', либо действие, этот ответ для шаблона. Я также обновил ответ с помощью action_caching. – xlembouras

 Смежные вопросы

  • Нет связанных вопросов^_^