rack jsonp não trabalhar para pedidos simples, mas funciona para chamadas .js em Rails 2.3
-
16-09-2019 - |
Pergunta
Eu estou usando Rails 2.3 e eu decidi fornecer suporte para JSONP. Criou um aplicativo novo. Em seguida, correu script / gerar nome de usuário andaime: string
Esta é toda a minha environment.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
Quando eu visito localhost: 3000 / usuários tudo que eu vejo é um hash. Quando eu visito localhost:?. 3000 / users.js callback = mostrar então eu obter um bom resultado
Vamos olhar o jsonp código. Eu não entendo por que a resposta está sendo enrolada em uma matriz.
Eu criei outro middleware rack onde eu substituído esta declaração
[status, headers, [response]]
com esta declaração
[status, headers, response]
E bem agora tudo está funcionando.
Eu me recuso a acreditar que este é um bug no rack de contrib.
Alguém pode me esclarecer por que a resposta está sendo envolvido em um array e como eu poderia usar em rack contrib em meu aplicativo.
O código fonte completo da minha candidatura é aqui . Apenas clone ele e executado em localhost:. 3000
Solução
Esse código é errado. Aqui está o que deve ser:
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
Foi incorrectamente envolvendo a resposta em uma matriz, no caso em que os parâmetros não incluem uma chamada de retorno. A razão precisa colocar a resposta em uma matriz no caso em que params não inclui uma chamada de retorno é porque as respostas da cremalheira deve responder a .each ().