2009-08-08 3 views
1

У меня есть действие контроллера, которое может извлечь выгоду из кэширования. Однако, когда я включаю кеширование действий через обычное:Возможно ли сделать работу caches_action для метода контроллера рельсов, доступ к которому осуществляется через HTTP POST?

caches_action :myaction, :expires_in=>15.minutes 

... кэширование не вызывает. Похоже, это потому, что действие вызывается с помощью HTTP POST. Для подобных действий, вызванных использованием HTTP GET, кеширование работает нормально.

Я понимаю, что использование POST для этого действия, вероятно, не является отличным стилем и прерывает соглашения о маршрутизации ресурсов - по-видимому, это также то, почему ответ не кэшируется, даже если это возможно. Однако пока я застрял в этом, так как это то, что делает клиент в настоящее время, и я не могу легко его изменить.

Итак, есть ли способ принудительно кэшировать этот метод, хотя он доступен через POST?

Редактировать: Я должен уточнить, возможно, что POST не имеет побочных эффектов, поэтому безопасно кэшировать действие. На самом деле это должно было быть ПОЛУЧЕНИЕ, в первую очередь, просто нет и не может быть легко изменено. Кроме того, для этого не имеет значения, что браузеры или прокси не будут кэшировать ответ.

ответ

1

Являются ли содержание данных сообщения одинаковыми для каждого сообщения? Я подозреваю, что они не подходят, и поэтому действие не будет кэшировано.

Несколько способов борьбы с этим:

1) Забудьте о caches_action и использовать Rails.cache легко внутри контроллера кэшировать дорогие части вашего кода контроллера

2) Использование Rack Middleware/Metal Endpoint, чтобы получать данные из другого приложения и загружать данные в нужную вам форму.

редактировать:

Im рельсы 2.3.3 и я могу подтвердить, что это POST кэш запросов

Для целей проверки в то время как ваши разработки убедитесь, что вы установили perform_caching истину в разработке .rb:

config.action_controller.perform_caching    = true 

Также убедитесь, что его же в production.rb

Я тестировал этот сценарий следующим в моем контроллере:

caches_action :index 

def index 
    @listings = Listing.find(:all) 
end 

Использование как GET и POST запросов этот кэшируются, как и ожидалось. Также я попытался установить HTTP-заголовки Cache-Control: нет-кэша на моем почтовом клиенте и действие еще кэшированные

Если вы работаете OSX использовать этот удивительный инструмент для создания http://ditchnet.org/httpclient/ GET и POST запросы

+0

Параметры идентичны - есть ли другие данные с сообщением (заголовки?), которые могут привести к его не кешированию? Я не вижу их в журналах, но, возможно, клиент настраивает заголовки, требующие обхода кеша? Я дам предложение Rails.cache. Для стойки/металла мне нужны рельсы 2.3? Сейчас я на 2.2.2. – frankodwyer

+0

См. Исправления выше для ваших комментариев. – ADAM

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

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