Можно ли заставить caches_action работать для метода контроллера rails, доступ к которому осуществляется через HTTP POST? - PullRequest
1 голос
/ 08 августа 2009

У меня есть действие контроллера, которое может выиграть от кэширования. Тем не менее, когда я включаю кеширование действий с помощью обычного:

  caches_action :myaction, :expires_in=>15.minutes

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

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

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

edit: я должен уточнить, возможно, что POST не имеет побочных эффектов, так что это безопасно кэшировать действие Во-первых, это действительно должен был быть GET, он просто не может и не может быть легко изменен на данный момент. Также не имеет значения, что браузеры или прокси не будут кэшировать ответ.

1 Ответ

1 голос
/ 15 августа 2009

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

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

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

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

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

Я использую Rails 2.3.3, и я могу подтвердить, что он кеширует POST-запросы

В целях проверки во время разработки убедитесь, что вы установили для execute_caching значение true в development.rb:

config.action_controller.perform_caching             = true

Также убедитесь, что это то же самое в продукции. Rb

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

 caches_action :index

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...