Проблема с кэшированием страниц Rails и автоматическими расширениями

У меня есть API на основе JSON и XML , который необходимо кэшировать страницы. Я настроил свои маршруты на api, чтобы включить формат как часть URL-адреса, так что URL-адрес работает следующим образом:

http://example.com/foo/1/bar/2/xml
http://example.com/foo/1/bar/2/json

Проблема, которую я вижу, заключается в том, что в общедоступной папке сервера файлы сохраняются как xml.xml и json.json , и это вызывает промахи кеша при следующем обращении к URL.

Есть ли способ:

  1. Отключить автоматическое создание расширений, чтобы они сохранялись без расширения вообще? (Пример: RAILS_ROOT / public / foo / 1 / bar / 2 / json )
  2. Установить для всех расширений значение .html для каждого вызова. (Пример: RAILS_ROOT / public / foo / 1 / bar / 2 / json.html )

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

РЕДАКТИРОВАТЬ:
Кто-то спросил соответствующий маршрут:

scope '(foo/:foo_id)', :foo_id => /\d+/ do
  get '/bar/:bar_id/:format' => 'bars#show', :bar_id => /\d+/, :format => /json|xml|html/
end



РЕШЕНИЕ :
файлы сохраняются как xml.xml и json.json , и это вызывает промахи кеша при следующем обращении к URL-адресу.

Есть ли способ:

  1. Отключить автоматическое создание расширений, чтобы они вообще сохранялись без расширения? (Пример: RAILS_ROOT / public / foo / 1 / bar / 2 / json )
  2. Установить для всех расширений значение .html для каждого вызова. (Пример: RAILS_ROOT / public / foo / 1 / bar / 2 / json.html )

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

РЕДАКТИРОВАТЬ:
Кто-то спросил соответствующий маршрут:

scope '(foo/:foo_id)', :foo_id => /\d+/ do
  get '/bar/:bar_id/:format' => 'bars#show', :bar_id => /\d+/, :format => /json|xml|html/
end



РЕШЕНИЕ :
файлы сохраняются как xml.xml и json.json , и это вызывает промахи кеша при следующем обращении к URL-адресу.

Есть ли способ:

  1. Отключить автоматическое создание расширений, чтобы они вообще сохранялись без расширения? (Пример: RAILS_ROOT / public / foo / 1 / bar / 2 / json )
  2. Установить для всех расширений значение .html для каждого вызова. (Пример: RAILS_ROOT / public / foo / 1 / bar / 2 / json.html )

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

РЕДАКТИРОВАТЬ:
Кто-то спросил соответствующий маршрут:

scope '(foo/:foo_id)', :foo_id => /\d+/ do
  get '/bar/:bar_id/:format' => 'bars#show', :bar_id => /\d+/, :format => /json|xml|html/
end



РЕШЕНИЕ :

  1. Отключить автоматическое создание расширений, чтобы они вообще сохранялись без расширения? (Пример: RAILS_ROOT / public / foo / 1 / bar / 2 / json )
  2. Установить для всех расширений значение .html для каждого вызова. (Пример: RAILS_ROOT / public / foo / 1 / bar / 2 / json.html )

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

РЕДАКТИРОВАТЬ:
Кто-то спросил соответствующий маршрут:

scope '(foo/:foo_id)', :foo_id => /\d+/ do
  get '/bar/:bar_id/:format' => 'bars#show', :bar_id => /\d+/, :format => /json|xml|html/
end



РЕШЕНИЕ :

  1. Отключить автоматическое создание расширений, чтобы они вообще сохранялись без расширения? (Пример: RAILS_ROOT / public / foo / 1 / bar / 2 / json )
  2. Установить для всех расширений значение .html для каждого вызова. (Пример: RAILS_ROOT / public / foo / 1 / bar / 2 / json.html )

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

РЕДАКТИРОВАТЬ:
Кто-то спросил соответствующий маршрут:

scope '(foo/:foo_id)', :foo_id => /\d+/ do
  get '/bar/:bar_id/:format' => 'bars#show', :bar_id => /\d+/, :format => /json|xml|html/
end



РЕШЕНИЕ :
Пока я искал официальный способ сделать это с помощью встроенной поддержки кэширования страниц, в итоге я просто использовал фильтр после и мой собственный метод кеширования страниц, как предложил Антон

# application_controller.rb
def cache_api_page
  if REDACTEDServer::Application.config.action_controller.perform_caching
    self.class.cache_page(response.body, request.path, '')
    puts "CACHED PATH: #{request.path}"
  end
end

# bar_controller.rb
 after_filter :cache_api_page, :only => [ :show, :index ]
6
задан coneybeare 22 May 2011 в 16:36
поделиться