Фрагмент кеширования Jbuilder с использованием Dalli на Heroku

Я пытаюсь использовать фрагментное кэширование с Jbuilder, так как для одного из представлений требуется довольно много времени для рендеринга (только рендеринг представления может занять 2500мс +

Обратите внимание, что это работает в других вызовах, но этот не может работать, и я не могу понять, почему. Второе: это работает на моей локальной машине, но не в героку.

Вот ошибка в героку:

2013-09-18T21:05:46.425034+00:00 app[web.1]:   Rendered api/shop/products/_product.json.jbuilder (3.2ms) 
2013-09-18T21:05:46.606141+00:00 app[web.1]: Marshalling error for key 'shop/products/344-20130914175034924266000/shop/products/346-20130914175035358419000/shop/products/345-20130914175035153905000/en/b5262bbbd44fb696ffdece67a464e218': no _dump_data is defined for class Proc 
2013-09-18T21:05:46.606141+00:00 app[web.1]: You are trying to cache a Ruby object which cannot be serialized to memcached. 
2013-09-18T21:05:46.606141+00:00 app[web.1]: /app/vendor/bundle/ruby/2.0.0/gems/dalli-2.6.4/lib/dalli/server.rb:397:in `dump' 
2013-09-18T21:05:46.606141+00:00 app[web.1]:    /app/vendor/bundle/ruby/2.0.0/gems/dalli-2.6.4/lib/dalli/server.rb:397:in `serialize' 
2013-09-18T21:05:46.606141+00:00 app[web.1]:    /app/vendor/bundle/ruby/2.0.0/gems/dalli-2.6.4/lib/dalli/server.rb:269:in `set' 
2013-09-18T21:05:46.606141+00:00 app[web.1]:    /app/vendor/bundle/ruby/2.0.0/gems/dalli-2.6.4/lib/dalli/server.rb:60:in `request' 
2013-09-18T21:05:46.606141+00:00 app[web.1]:    /app/vendor/bundle/ruby/2.0.0/gems/dalli-2.6.4/lib/dalli/options.rb:18:in `block in request'

Вот простая часть, где я пытался использовать фрагментный кеш:

json.cache! [category[:products], I18n.locale] do
  json.products category[:products] do |product|
    json.partial! product
  end
end

И продукт частичный:

json.(
  product,
  :id,
  :name,
  :picture,
  :price,
  :subcategory
)

json.product_options product.product_options do |option|
  json.(
    option,
    :id,
    :name,
    :option_type
  )

  json.option_items option.product_option_items do |item|
    json.(
      item,
      :id,
      :name
    )
  end
end

json.partial! 'api/app_styles/app_style', app_style: product.app_style
  • обратите внимание, что партиал app_style используется везде и работает с другими кэшированными представлениями

2 ответа

Решение

Итак, после некоторого глубокого копания я наконец обнаружил, что это проблема с

  1. rails_stdout_logging gem
  2. скрепка драгоценный камень
  3. Конфигурация скрепки с хранилищем S3
  4. JBuilder

Комбинация этих трех вещей + использование объекта paperclip вместо URL (то есть json.node_name my_model.paperclip_attached_file вместо json.node_name my_model.paperclip_attached_file.url) привели к сбою.

Теперь, кажется, работает фейирски...

Таким образом, Мэтью был прав, говоря, что картинка была проблемной, но только с конфигурацией rails_stdout_gem + paperclip S3

Ошибка: вы пытаетесь кэшировать объект Ruby, который нельзя сериализовать в memcached

Это то место, куда вы должны обратить внимание: оно пытается маршалировать объект с помощью процедуры, процессы оцениваются только во время выполнения и не могут быть сериализованы.

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

Другие вопросы по тегам