rack-jsonp не работает для простых запросов, но работает для вызовов .js в Rails 2.3 - PullRequest
1 голос
/ 15 июля 2009

Я использую Rails 2.3, и я решил предоставить поддержку JSONP. Создано совершенно новое приложение. Затем запустил скрипт / сгенерировал скаффолд Имя пользователя: строка

Это все мое окружение. Rb

RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION
require File.join(File.dirname(__FILE__), 'boot')
require 'rack/contrib'
Rails::Initializer.run do |config|
 config.middleware.use 'Rack::JSONP'
end

Когда я захожу на localhost: 3000 / users, я получаю только хэш. Когда я захожу на localhost: 3000 / users.js? Callback = show, я получаю хороший результат.

Давайте посмотрим на код jsonp . Я не понимаю, почему ответ оборачивается в массив.

Я создал другое промежуточное программное обеспечение Rack, где я заменил это утверждение

      [status, headers, [response]]

с этим утверждением

      [status, headers, response]

А теперь все работает нормально.

Я отказываюсь верить, что это ошибка в rack-contrib.

Может ли кто-нибудь объяснить мне, почему ответ помещается в массив и как я могу использовать rack-contrib в своем приложении.

Полный исходный код моего приложения здесь . Просто клонируйте его и запустите на localhost: 3000.

1 Ответ

2 голосов
/ 03 сентября 2009

Этот код неправильный. Вот что должно быть:

def call(env)
  status, headers, response = @app.call(env)
  request = Rack::Request.new(env)
  if request.params.include?('callback')
    response = [pad(request.params.delete('callback'), response)]
    headers['Content-Length'] = response.length.to_s
  end
  [status, headers, response]
end

Неправильно упаковывать ответ в массив в том случае, если в параметрах отсутствует обратный вызов. Причина, по которой необходимо обернуть ответ в массив в случае, когда params включает обратный вызов, заключается в том, что ответы Rack должны отвечать .each ().

...