Примечание. Я представляю здесь логику, что я делаю.
Что я делаю:
Подумайте об основном действии индекса, в котором мы перечисляем продукты и с разбивкой на страницы. Теперь, используя параметр remote-true, я включил разбиение на страницы на основе ajax. Пока все работает отлично. Посмотрите пример кода.
Контроллер продуктов:
def index
@products = Product.paginate(:order =>"name ASC" ,:page => params[:page], :per_page => 14)
respond_to do |format|
format.html # index.html.erb
format.json { render json: @products }
format.js
end
end
index.html.erb
<h1>Products</h1>
<div id="products">
<%= render "products/products" %> // products partial is just basic html rendering
</div>
<script>
$(function(){
$('.pagination a').attr('data-remote', 'true')
});
</script>
Index.js.erb
jQuery('#products').html("<%= escape_javascript (render :partial => 'products/products' ) %>");
$('.pagination a').attr('data-remote', 'true');
Итак, в чем проблема:
Теперь я хочу включить кеширование действий. Но файл index.js.erb не манипулирует DOM. Если я удалю функцию remote-true, все будет хорошо работать с кешированием.
Для кэширования действий я добавил эту строку в верхней части контроллера:
caches_action :index, :cache_path => Proc.new { |c| c.params }
Любые предложения?
Update:
Проблема заключается в том, что код jquery не выполняется. Из этого вопроса
Я понял, что случилось. jQuery фактически окружает входящий script так, чтобы браузер оценивал входящий код. Но кеширование mechansim просто сохраняет код как текст, и когда один повторный запрос, он возвращает код как текст, но не оценивает его. Таким образом, нужно явно вычислить код
Но как решить эту проблему?