2009-07-15 4 views
1

Ich benutze Rails 2.3 und ich habe beschlossen, Unterstützung für JSONP bereitzustellen. Erstellt eine brandneue Anwendung. Dann lief Skript/generieren Gerüst Benutzername: stringrack-jsonp funktioniert nicht für einfache Anfragen, funktioniert aber für .js Aufrufe in Rails 2.3

Das ist meine ganze 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 

Wenn ich besuchen localhost: 3000/Anwender alles, was ich bekommen ein Hash ist. Wenn ich localhost besuche: 3000/users.js? Callback = Show dann bekomme ich ein gutes Ergebnis.

Schauen wir uns die jsonp code. Ich verstehe nicht, warum die Antwort in ein Array gewickelt wird.

erstellt ich eine andere Rack-Middleware, wo ich

 [status, headers, [response]] 

mit dieser Aussage

 [status, headers, response] 

Und jetzt alles funktioniert prima diese Aussage ersetzt.

Ich weigere mich zu glauben, dass dies ein Bug in Rack-Beitrag ist.

Kann mir jemand erklären, warum die Antwort in einem Array verpackt ist und wie ich Rack-Contrib in meiner Anwendung verwenden kann.

Der vollständige Quellcode meiner Anwendung is here. Einfach klonen und auf localhost: 3000 ausführen.

Antwort

2

Dieser Code ist falsch. Hier ist, was es sein sollte:

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 

Es wurde falsch die Antwort in einem Array in dem Fall, in dem die Umhüllung params nicht einen Rückruf enthalten war. Der Grund für das Umbrechen der Antwort in ein Array für den Fall, dass Params einen Rückruf enthält, liegt daran, dass Rack-Antworten auf .each() antworten müssen.

Verwandte Themen