質問

私は持っています 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

ランプサーバー上のスリムなフレームワークを使用して、追加できます 応答ステータス消去 ルート(または何も返さないカスタムルート)

$app->response()->status(204);//204 No Content

これにより、コンテンツタイプをテキスト/HTMLに戻して、空のボディを許可します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top