backbone model.destroy()正常に動作している場合でもエラーコールバック関数を呼び出す?
質問
私は持っています Backbone.js ユーザーがモデルのビューでリンクをクリックしたときに破壊しようとしているモデル。ビューは次のようなものです(Pseudocodeはで実装されているため coffeescript 質問の一番下にあります)。
var window.ListingSaveView = Backbone.View.extend({
events: {
'click a.delete': 'onDestroy'
},
onDestroy: function(event){
event.preventDefault();
this.model.destroy({
success: function(model, response){
console.log "Success";
},
error: function(model, response){
console.log "Error";
}
});
}
});
クリックすると delete
ブラウザでリンクして、私はいつも取得します Error
私のサーバーが関連するデータベースレコードの破壊が成功し、200の応答を返すにもかかわらず、コンソールにログインしました。ページを更新すると(コレクションがDBから再レンダリングされます)、削除したモデルはなくなります。
興味深いのは、これを記録するときです response
エラーコールバックでは、ステータスコードがあります 200
成功を示しますが、報告します statusText: "parseerror"
それがどのような意味でも。サーバーログにエラーはありません。
私は何が間違っているのですか?
これはサーバーからの応答です。
Object
abort: function ( statusText ) {
always: function () {
complete: function () {
done: function () {
error: function () {
fail: function () {
getAllResponseHeaders: function () {
getResponseHeader: function ( key ) {
isRejected: function () {
isResolved: function () {
overrideMimeType: function ( type ) {
pipe: function ( fnDone, fnFail ) {
promise: function ( obj ) {
readyState: 4
responseText: " "
setRequestHeader: function ( name, value ) {
status: 200
statusCode: function ( map ) {
statusText: "parsererror"
success: function () {
then: function ( doneCallbacks, failCallbacks ) {
__proto__: Object
これが破壊するサーバーのアクションです(Ruby on Rails)
# DELETE /team/listing_saves/1.json
def destroy
@save = current_user.team.listing_saves.find(params[:id])
@save.destroy
respond_to do |format|
format.json { head :ok }
end
end
そして、これがそのようにそれを好む人々のためのバックボーンビューの実際のコーヒースクリプトの実装です:
class MoveOutOrg.Views.ListingSaveView extends Backbone.View
tagName: 'li'
className: 'listing_save'
template: JST['backbone/templates/listing_save']
events:
'click a.delete_saved': 'onDestroy'
initialize: ->
@model.bind 'change', this.render
render: =>
renderedContent = @template(@model.toJSON())
$(@el).html(renderedContent)
this
onDestroy: (event) ->
event.preventDefault() # stop the hash being added to the URL
console.log "Listing Destroyed"
@model.destroy
success: (model, response)->
console.log "Success"
console.log model
console.log response
error: (model, response) ->
console.log "Error"
console.log model # this is the ListingSave model
console.log response
解決
@David Tuiteコメント:
「わかりました。バックボーンは、JSON応答が破壊されたレコードのJSONシリアル化であると予想しているようです。ただし、Railsコントローラージェネレーターはヘッドのみを返します。 @listing_save @listing_saveは、私が破壊したばかりのレコードであり、成功を登録します。」
FYI-あなたが破壊をしているとき、あなたは破壊されたモデルのために完全なJSONを返す必要はありません。空のJSONハッシュを返すことができれば、うまく機能します。モデルのJSONを返す必要があるのは、保存 /更新です。
他のヒント
私は同じ問題を抱えていました。サーバーの削除メソッド(Java)では、何も返さなかった。ステータス200/ok(または204/no no content)のみ。したがって、「parsererror」の問題は、jqueryが空の応答をjsonに変換しようとすることによって引き起こされましたが、これは失敗しました(「json」はデフォルトのデータ型であるため)。
私の解決策は、代わりに「テキスト」データタイプを使用することでした。これはオプションで設定できます。
model.destroy({ dataType: "text", success: function(model, response) {
console.log("success");
}});
コンテンツを返さないため、応答はステータスコード204が必要です。 BackboneはRESTインターフェイスを使用するため、タスクに応じて異なるHTTPステータスコードを返す必要があります。
あなたはあなたのURLを確かにしていますか?追加しますか? .json
Backbone.model URLの終わりに?サーバー側でこれを確認するので(Respons_to | format | ... end)、正しいものを送信しないかもしれません head :ok
応答
これで試してみてください destroy
これが問題であるかどうかをテストするためのRails方法:
def destroy
@save = current_user.team.listing_saves.find(params[:id])
@save.destroy
head :ok
end