Sencha似乎不喜欢Rails的json

我有一个Rails控制器,它将一些模型呈现给json。

@events = Event.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @events } format.json { render :json => { :results => @events } } end 

输出如下:

 { "results": [ { "name":"test", "created_at":"2011-03-23T13:32:57Z", "latitude":60.0, "location":null, "updated_at":"2011-04-14T16:38:54Z", "id":1, "longitude":30.0, "takes_place_at":"2011-03-23T13:32:00Z" }, { "name":"x", "created_at":"2011-03-23T13:36:44Z", "latitude":60.0, "location":null, "updated_at":"2011-03-23T13:36:44Z", "id":2, "longitude":30.0, "takes_place_at":"2011-03-23T13:36:00Z" }, { "name":"Gruempi", "created_at":"2011-03-24T14:00:32Z", "latitude":60.0, "location":null, "updated_at":"2011-04-14T16:39:47Z", "id":3, "longitude":30.0, "takes_place_at":"2011-03-24T14:00:00Z" }, { "name":"ba", "created_at":"2011-04-10T22:40:07Z", "latitude":60.0, "location":"12, 14", "updated_at":"2011-04-10T22:40:07Z", "id":4, "longitude":30.0, "takes_place_at":"2011-04-10T22:36:00Z" }, { "name":"sfasdfs", "created_at":"2011-04-10T22:44:55Z", "latitude":60.0, "location":"we're try to find you ...", "updated_at":"2011-04-10T22:44:55Z", "id":5, "longitude":30.0, "takes_place_at":"2011-04-10T22:42:00Z" }, { "name":"asdfsad", "created_at":"2011-04-10T22:55:03Z", "latitude":60.0, "location":"we're try to find you ..asfd.", "updated_at":"2011-04-10T22:55:03Z", "id":6, "longitude":30.0, "takes_place_at":"2011-04-10T22:54:00Z" } ] } 

我尝试使用sencha / extjs来使用服务:

 refresh = function() { Ext.util.JSONP.request({ url: 'http://localhost:3000/search/by_date.json', callbackKey: 'callback', params: { year:"2011", month:"04", day:"10", uniqueify: Math.random() }, callback: function(data) { var events = data.results; timeline.update(events); } }); }; 

和sencha只是不解析它。 同时它适用于像Twitter这样的API调用。

我做错了什么想法? 或者我怎么能找到这个bug?

如果您正在执行JSONP请求,则需要将返回的JSON包装在GET请求中指定为参数的函数中,在您的情况下为“回调”。 Sencha touch将在内部处理函数命名,但您需要记下传入的callbackKey选项,以便服务器可以正常响应。

在请求http:// localhost:3000 / search / by_date.json?callback = jsonP2343243243时 ,预期的响应应该包含在callback参数指定的函数中。 该GET请求应该产生以下JSON:

jsonP2343243243({ "results": [ ... ] });

这将导致在浏览器解释该函数时调用该函数,然后将调用AJAX的回调。 在rails中,您需要将渲染更改为:

Rails <3.0:

 format.js { render :js => params[:callback] + "(" + { :results => @events }.to_json + ");"} 

Rails> 3.0

 format.js { render :json => { :results => @events }, :callback => params[:callback] }