Ошибка обратного вызова всегда срабатывает, даже если она успешна - PullRequest
2 голосов
/ 17 августа 2011

Должен быть сбой в моем синтаксисе или что-то, чего я не понял, но когда я делаю метод сохранения в моей модели. Обратный вызов ошибки вызывается независимо от результата метода.

    @new_activity = new Activity()

    @new_activity.save
        know: $('input#know').val()
        learn: $('input#learn').val()

        success: -> console.log 'success'
        error: -> console.log 'error'

В моем случае, поскольку я не знаю, действительно ли new_activity успешно прошел валидацию, я должен сделать некрасивый трюк, чтобы добавить действие в коллекцию. (Между прочим, я не использую метод create, так как я хочу иметь разные ошибки, а не просто «false».

    if @new_activity.has('know') and @new_activity.has('learn')
        app.collections.activities.add @new_activity

Когда это успешно, хотя; оповещение о созданной модели.

Редактировать: Более подробная информация. Вот моя модель: инициализировать: -> _.bindAll @, 'validate', 'errorHandler' @ .bind 'error', @ errorHandler

validate: (attrs) ->
    errors = []
    # We only support a certain number of languages, we enforce that the user does not select a wrong set.
    if _.isEmpty(_.intersection([attrs.know], ['en', 'fr'])) is true
        errors.push 'This language is not currently supported.'

    if _.isEmpty(_.intersection([attrs.learn], ['en', 'fr', 'de', 'es', 'zh', 'pt', 'ar', 'ja', 'ru'])) is true
        errors.push 'You cannot learn this language yet.'

    if _.isEmpty(errors) is false
        errors

errorHandler: (model, error) ->
    console.log error

Когда происходит проверка и если метод validate ничего не возвращает, он все равно вызывает событие ошибки, а переменная ошибки содержит модель (но без сообщения об ошибке).

Ответы [ 3 ]

4 голосов
/ 02 февраля 2012

Проблема в том, что Rails отправляет единичный пробел с head :ok.Если вы отправляете обратно пустую строку, Backbone прекрасно с ней справится.

Правильный способ сделать это - отправить обратно 204 No Content.Вы можете сделать это, заменив head :ok на head :no_content в блоке format.json.Rails не отправит обратно ничего в теле HTTP.

4 голосов
/ 17 августа 2011

Вы должны проверить, правильно ли сохранено new_activity, убедитесь, что сервер возвращает успешный ответ на запрос PUT.

Кроме того, у меня возникли проблемы с использованием стандарта Rails 3.1 format.json { head :ok }, поскольку он возвращаетодиночный пробел как ответ и application / json как тип контента.Затем Backbone пытается проанализировать JSON и умирает с ошибкой.

0 голосов
/ 18 августа 2011

Я не уверен, в чем причина вашей ошибки, но я думаю, что могу помочь вам определить это:

Глядя на аннотированный источник для Backbone.js, вы можете видеть, что save() относится к sync(), что, в свою очередь, относится к $. Ajax в jQuery. В конечном счете, ваша error функция (обернутая wrapError в Backbone) вызывается из этого.

К сожалению, оболочка отбрасывает все, кроме аргумента jqXHR, что делает отладку немного сложнее. Поэтому вы можете попробовать взломать ваш локальный исходный файл Backbone.js, чтобы заменить существующую функцию wrapError на что-то вроде этого:

var wrapError = function(onError, model, options) {
    return function(jqXHR, textStatus, errorThrown) {
      console.log(jqXHR);
      console.log(textStatus);
      console.log(errorThrown);
      if (onError) {
        onError(model, jqXHR, options);
      } else {
        model.trigger('error', model, jqXHR, options);
      }
    };
  };

Тогда, по крайней мере, вы увидите все данные отладки, предоставленные jQuery, на вашей консоли.

...