Rails3 Rack response - неопределенный метод response.body - PullRequest
3 голосов
/ 19 декабря 2010
  def call(env)
    status, headers, response = @app.call(env)

    if response.is_a? Array
      puts response.inspect
    else
      puts response.class.to_s
    end

    [status, headers, response]
  end

Из development.log:

Первый запрос:

Completed 200 OK in 95ms (Views: 35.9ms | ActiveRecord: 1.5ms)
ActionDispatch::Response

Второй и другие запросы:

Completed 200 OK in 77ms (Views: 76.3ms | ActiveRecord: 0.0ms)
[]

ответ: ActionDispatch::Response при первом вызове маршрута, для любых других запросов для этого точного URL, это пустой Array

Страница успешно отображается в обоих случаях, но я не могу использовать response.body, когда ответом является пустой массив.

Это нормальное поведение Rails? Есть ли здесь кеширование даже в среде разработчиков?

1 Ответ

1 голос
/ 03 мая 2011

Я вижу то же самое.

Я обнаружил, что консоль будет отображать только последний код состояния HTTP (200 OK), но с консолью отладчика я вижу другой код (304, "НеМодифицировано ". Подробнее об этом здесь )

Природа кода 304 такова, что ответ будет пустым, потому что сервер говорит вашему браузеру просто использовать кеш.Ваш браузер отправляет условный запрос GET (что должно быть нормальным поведением браузера?), И именно это заставляет ваш сервер вести себя таким образом.Ваш браузер не знает, что вы находитесь в режиме разработки, поэтому он будет вести себя как обычно.

Обратите внимание, что я смог обойти эту ошибку, выполнив CTRL-F5 для обновления (в Firefox),которая является командой для обновления и игнорирования кэша.Таким образом, браузер выполняет простой GET вместо условного.

Вот код, который я использовал, чтобы помочь мне понять, что происходит (требуется гем ruby-debug).

def call(env)
  status, headers, response = @app.call(env)
  debugger
  if headers["Content-Type"].include?("text/html")
    [status, headers, "<!--hello world! -->" + response.body]
  else
    [status, headers, response]
  end
end

После этого загрузите страницу и в терминале rail server:

(rdb:1) irb
irb(#<PostRedirect:0x7f9c6292a530>):001:0> status
=> 304

Мое исправление заключалось в добавлении проверки кода состояния:

  if (status != 304) && headers["Content-Type"].include?("text/html")
...