我有一个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调用。
任何想法我做错了什么?或者我如何找到错误?
答案 0 :(得分:7)
如果您正在执行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] }