Rails условного get (режим разработки) по-прежнему возвращает «Not Modified» (`#fresh_when ()`) - PullRequest
4 голосов
/ 07 ноября 2011

Почему следующее (в режиме разработки) неправильно возвращает «304 не изменено» - не должны ли такие функции отключаться по умолчанию в Rails при работе в режиме разработки?

Мой контроллер выглядит так:

class WidgetController < ApplicationController

  def show
    @widget = Widget.find(params[:id])
    fresh_when(etag: etag_for(@widget), last_modified: @widget.updated_at)
  end

  private

    def etag_for(*args)
      args.flatten + [current_user, last_deploy]
    end

    def last_deploy
      `git log --pretty=format:%H`.chomp
    end

end

Я не понимаю, почему в режиме Development в моем приложении Rails это будет возвращать заголовки "304 Not Modified", я думал, что в соответствии с режимом разработки такие вещи не были включены?

Я использую тонкий веб-сервер локально, что, я полагаю, немного необычно, в противном случае это типичное приложение без особых условий или случаи, запущенные на Rails 3.1.1

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

Так что ответ был проще, чем:

В ./config/environments/development.rb я добавил строку:

  config.middleware.delete(Rack::ConditionalGet)

Я отправил эту "ошибку" в Rails, чтобы получить официальный ответ, проблему можно найти здесь, на их трекере Github .

0 голосов
/ 07 ноября 2011

fresh_when не изменяется окружающей средой. За источник для fresh_when

def fresh_when(options)
  options.assert_valid_keys(:etag, :last_modified, :public)

  response.etag          = options[:etag]          if options[:etag]
  response.last_modified = options[:last_modified] if options[:last_modified]
  response.cache_control[:public] = true if options[:public]

  head :not_modified if request.fresh?(response)
end

А потом источник для request.fresh?

def fresh?(response)
  last_modified = if_modified_since
  etag          = if_none_match

  return false unless last_modified || etag

  success = true
  success &&= not_modified?(response.last_modified) if last_modified
  success &&= etag_matches?(response.etag) if etag
  success
end

Однако вы могли бы добавить случайное число (или метку времени) к etag в режиме разработки, чтобы каждый запрос был свежим.

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