Rails 3: caches_action и root: к проблеме - PullRequest
0 голосов
/ 11 июля 2011

Так что я использую caches_action :page в моем публичном контроллере.В моем route.rb я указываю root :to => "public#page" .Действие страницы содержит следующую строку: @pictures = Picture.paginate :page => params[:id] || 1, так что обычно корневой путь всегда показывает действие страницы с самой первой частью изображений.Моя проблема в том, что после того, как я начал использовать кеш, root иногда отображает действие страницы, но не с id = 1, а с другим идентификатором (я думаю, это просто еще одна кэшированная «страница»), так что картинки, показанные в корнене самые новые.

Как я могу настроить его так, чтобы root всегда указывал на кешированный :controller => public, :action => page, :id => 1?

Ответы [ 3 ]

2 голосов
/ 11 июля 2011

Кэширование действий не работает с параметрами (игнорирует их). Вы можете попробовать использовать JavaScript для извлечения идентификатора из URL и загрузки изображений через AJAX.

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

РЕДАКТИРОВАТЬ: Кэширование не учитывает строка запроса параметры

UPDATE:

Я думаю, что вы хотите сделать, описано здесь: Кэширование действий Rails с параметрами строки запроса

1 голос
/ 21 февраля 2012

У меня была такая же проблема. Я нашел два хороших способа решить это. Вариант 1 будет хранить копию всех пользовательских запросов в вашем кэше. Если на вашем сайте много запросов, которые не будут повторяться, или вас беспокоит пространство памяти, это не идеально. Вариант 2 только кэширует страницы без параметров.

1) Поскольку «Wizard of Ogz» связан с, вы можете использовать: cache_path для включения параметров в ключ кэша, чтобы страницы с параметрами кэшировались отдельно от запроса без параметров.

caches_action :page,
  :cache_path => proc {|c|
    {:tag => c.params}
  }

2) Вы можете использовать: если пропустить процесс и не кэшировать действие вообще, если параметры присутствуют. Это не позволит настраивать поиск в вашей кеш-памяти.

caches_action :page,
 :if => proc {
    params.blank?
  }

Если это URL, отличный от вашего корня, вы можете удалить контроллер и параметры действий:

caches_action :page,
 :if => proc {
    updated_params = params.delete_if { |k,v| ['controller', 'action'].include?(k) }
    updated_params.blank?
  }

Вот соответствующая информация об API: http://api.rubyonrails.org/classes/ActionController/Caching/Actions.html

0 голосов
/ 11 июля 2011

Исходя из ответа от мастера ogz - вы можете использовать другой подход здесь, и вместо использования кэширования действий, установите метод в вашем классе изображений, который возвращает вам самые новые изображения, кэшируйте результат этого метод, а затем обновить кэш при загрузке новых изображений. Тогда вы могли бы сделать что-то вроде

@pictures = params[:id] ? {(Picture.paginate :page => params[:id]) : (Rails.cache.fetch('Picture.new_ones'){Picture.paginate :page => 1})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...