Сенча, кажется, не любит Json Rails - PullRequest
1 голос
/ 14 апреля 2011

У меня есть контроллер 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 просто doen 'разобрать это.Между тем он работает с API-вызовом, таким как Twitter.

Есть идеи, что я сделал не так?Или как я могу найти ошибку?

1 Ответ

7 голосов
/ 14 апреля 2011

Если вы выполняете запрос JSONP, вам нужно будет обернуть возвращенный JSON в функцию, указанную в качестве параметра в запросе GET, в вашем случае - «обратный вызов». Sencha touch будет обрабатывать внутреннее именование функций, но вам нужно учесть опцию callbackKey, которую вы передаете, чтобы ваш сервер мог правильно реагировать.

При запросе http://localhost:3000/search/by_date.json?callback=jsonP2343243243 ожидаемый ответ должен быть заключен в функцию, указанную параметром обратного вызова. Этот запрос GET должен привести к следующему JSON:

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

Это вызовет вызов этой функции, когда она интерпретируется браузером, а затем будет вызван обратный вызов AJAX. В рельсах вам нужно изменить рендеринг на что-то вроде:

Rails <3.0: </p>

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

Рельсы> 3,0

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