我的语法应该有一个小故障,或者我不理解的东西,但是当我在模型上做一个保存方法时。无论方法的结果如何,都会调用错误回调。
@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方法,因为我确实想要有不同的错误,而不是简单的“假”。
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方法没有返回任何内容,它仍会触发错误事件,错误变量包含模型(但没有错误消息)。
答案 0 :(得分:4)
您应该检查new_activity是否已正确保存,请验证服务器是否返回对PUT请求的成功响应。
此外,我在使用Rails 3.1标准format.json { head :ok }
时遇到了问题,因为它返回单个空格作为响应,application / json作为内容类型。然后Backbone尝试解析JSON并因错误而死亡。
答案 1 :(得分:4)
问题是Rails使用head :ok
发回的单个空间。如果你发回一个空字符串,Backbone可以很好地处理它。
这样做的正确方法是发回204 No Content
。您可以将head :ok
替换为head :no_content
块中的format.json
来实现。 Rails不会发回HTTP正文中的任何内容。
答案 2 :(得分:0)
我不确定您的错误的原因是什么,但我想我可以帮助您确定错误:
查看Backbone.js的annotated source,您可以看到save()
推迟到sync()
,而error
又推迟到jQuery的$.ajax。最终,您的wrapError
函数(由Backbone的jqXHR
包装)从中调用。
不幸的是,包装器会丢弃除wrapError
参数之外的所有参数,这使调试变得有点棘手。所以你可能想尝试攻击你的本地Backbone.js源文件,用这样的东西替换现有的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);
}
};
};
函数:
{{1}}
然后,至少,您将在控制台上看到jQuery提供的所有调试数据。