Вложение скрепки, не использующее правильное время update_at для строки запроса
Я использую Rails + Paperclip + S3. Я хочу разместить свои ресурсы в Cloudfront, используя один из моих кодов S3.
Я знаю, что Cloudfront кэширует активы, но вы можете разбить этот кеш, настроив его на пересылку строк запроса из источника.
Когда я изменяю актив, я ожидаю, что это произойдет
- Временная метка
updated_at
объекта ActiveRecord обновлена.
- Паперклип обновляет строку запроса изображения на S3, чтобы отобразить новое время
updated_at
.
- Cloudfront обслуживает новое изображение из-за новой строки запроса timestamp.
Однако, похоже, что Paperclip неправильно обновляет метку времени updated_at
. Может быть, он как-то кешировал. Поэтому строка запроса не обновляется, и Cloudfront никогда не разбивает кеш.
Моя модель:
class UserImage < ActiveRecord::Base
has_attached_file :image
end
>> ui = UserImage.find(576925)
>> ui.image.class
=> Paperclip::Attachment
>> ui.touch
>> ui.updated_at.to_i
=> 1386241041
>> ui.image.updated_at
=> 1386240937
Эти две метки update_at должны быть одинаковыми.
Ответы
Ответ 1
Похоже, что это могло быть ошибкой с более ранними версиями Paperclip (я на 2,7), поскольку он работает в будущих версиях.
Для справки это то, как я начал работать. В after_update на моей модели я принудительно обновляю экземпляр следующим образом:
image.instance_write(:updated_at, Time.now.utc)
self.send(:update_without_callbacks)
Мне пришлось сделать update_without_callbacks
, чтобы он не застревал в бесконечном цикле обратного вызова.
Теперь время updated_at
на вложении обновляется, вызывая обновление на Cloudfront.