Сохранение магистрали () Сообщение не отправляется

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

Однако мне сложно сохранить модели опросов на сервере. Не похоже, что почтовый запрос на самом деле происходит, и, следовательно, он фактически не обновляется. Есть идеи, что мне не хватает?

Модель обзора:

class SurveyMe.Models.Survey extends Backbone.Model

Обзор редактирования обзора:

 class SurveyMe.Views.SurveyEdit extends Backbone.View

      template: JST['templates/surveys/survey_edit']

      initialize: ->
        @model.on('all', @render, this)

      events: {
        'click #back': 'back'
        'submit #survey': 'update'
      }

      render: ->
        $(@el).html(@template(survey: @model))
        this

      back: ->
        Backbone.history.navigate("surveys",true)

      update: ->
        @model.set("title", $('#title').val())
        @model.set("survey_limit", $('#survey_limit').val())
        @model.save()
        Backbone.history.navigate("surveys",true)

Шаблон редактирования опроса:

<h1>Edit Survey</h1>
<form id="survey">
<div class="input-group">
    <span class="input-group-addon">Title:</span>
    <input id="title" type="text" class="form-control" value="<%= @survey.get('title') %>">
    <br>
</div>
<br>
<div class="input-group">
    <span class="input-group-addon">Desired Responses:</span>
    <input id="survey_limit" type="text" class="form-control" value="<%= @survey.get('survey_limit') %>">
    <br>
</div>
<hr>
<button class="btn" id="back">Back</button>
<input type="submit" class="btn" id="update" value="Update">
</form>

РЕДАКТИРОВАТЬ: добавление индекса / маршрутизатора / коллекции

Показатель:

class SurveyMe.Views.SurveysIndex extends Backbone.View

  template: JST['templates/surveys/index']

  events:
    'submit #survey':'createSurvey'

  initialize: ->
    @collection.on('reset', @render, this)
    @collection.on('add', @addSurvey, this)

  render: ->
    $(@el).html(@template())
    @collection.each(@addSurvey)
    console.log(@collection.length)
    this  

  addSurvey: (survey) ->
    view = new SurveyMe.Views.Survey(model: survey)
    @$('#surveys').append(view.render().el)

  createSurvey: ->
    console.log("Survey created")

Маршрутизатор:

class SurveyMe.Routers.Surveys extends Backbone.Router
  routes: 
    'surveys/:id': 'edit',
    'surveys': "index"

  initialize: ->
    @collection = new SurveyMe.Collections.Surveys()
    @collection.fetch(reset: true)

  index: ->
    view = new SurveyMe.Views.SurveysIndex(collection: @collection)
    $("#container").html(view.render().el)

  edit: (id) ->
    survey = @collection.get(id)
    view = new SurveyMe.Views.SurveyEdit(model: survey)
    $("#container").html(view.render().el)

Коллекция:

class SurveyMe.Collections.Surveys extends Backbone.Collection

  model: SurveyMe.Models.Survey

  url: '/surveys/'

person Tom Hammond    schedule 13.06.2014    source источник
comment
Можете ли вы выполнить некоторую отладку в своем Edit Route и посмотреть, верны ли следующие 2 вещи: @ определен и опрос найден правильно.   -  person jurassix    schedule 13.06.2014
comment
@ возвращается как объект, и кажется, что опрос был найден правильно, поскольку survey.get ('title') отодвигает заголовок   -  person Tom Hammond    schedule 13.06.2014
comment
в вашем методе createSurvey вы можете поместить туда оператор отладчика. Похоже, вам нужно захватить событие и остановить распространение; отладчик подтвердит ваше заявление о том, что этот метод не вызывается, когда вы отправляете форму.   -  person jurassix    schedule 13.06.2014


Ответы (3)


Здесь дикая догадка, но это может быть потому, что вы используете простую стрелку вместо толстой стрелки в coffeescript:

update: ->
  @title = $('#title').val()
  @survey_limit = $('#survey_limit').val()
  this.save()

Вы попадаете в этот метод с четного, что означает, что this привязан к триггеру события, а не к модели. Используйте жирную стрелку:

update: =>

И все должно быть хорошо ...

person Tallmaris    schedule 13.06.2014
comment
Хорошая мысль - наверное, часть проблемы :). Но я все еще не вижу, чтобы запрос POST даже сработал. - person Tom Hammond; 13.06.2014
comment
В браузере вы должны иметь возможность отлаживать свой JS, просто убедитесь, что код вызывается и что свойства установлены в модели. Если у вас есть код отладки из магистрали, вы также можете проверить, что происходит в методе сохранения. Может быть, у вас есть метод проверки, определенный в модели, и он не проходит проверку? - person Tallmaris; 14.06.2014

Ваша проблема может заключаться в update функции вашей модели. Я не вижу вызова fetch() для первоначального заполнения модели, поэтому я предполагаю, что данные заполняются только на стороне клиента и отправляются на сторону сервера. В этом случае вам необходимо установить эти данные в модели. Вы можете сделать это до вызова сохранения:

this.model.set("title", $('#title').val());
this.model.set("survey_limit", $('#survey_limit').val());

Или вы можете сделать это напрямую в вызове сохранения:

this.model.save({
   title: $('#title').val(),
   survey_limit: $('#survey_limit').val()
});

Вы можете сделать это внутри модели, но, как вы можете видеть из приведенного выше кода, я бы рекомендовал вместо этого поместить эту логику в представление. Таким образом, модель не должна понимать, что находится на самом виде.

person dylants    schedule 13.06.2014
comment
Я действительно сначала получаю данные (см. Правку выше). Я изменил функцию обновления в режиме редактирования, чтобы установить данные и затем сохранить их. Но он по-прежнему не заполняет сервер, а просто обновляет модель - я также обновил приведенный выше код. - person Tom Hammond; 13.06.2014
comment
Можете ли вы увидеть значения, отправленные в запросе POST в браузере (с помощью инспектора)? Если данные находятся в модели, она действительно должна их отправить ... Мне было бы интересно узнать, нет ли это. - person dylants; 13.06.2014
comment
Что ж, в этом вся проблема - я на самом деле не вижу срабатывания POST-запроса. - person Tom Hammond; 13.06.2014

У вашей модели тоже должно быть что-то вроде этого:

model.collection

Если вы передадите {collection: ...} в качестве параметров, модель получит свойство коллекции, которое будет использоваться, чтобы указать, к какой коллекции принадлежит модель, и используется для помощи в вычислении URL-адреса модели. Свойство model.collection обычно создается автоматически при первом добавлении модели в коллекцию. Обратите внимание, что обратное неверно, поскольку передача этой опции конструктору не приведет к автоматическому добавлению модели в коллекцию. Иногда полезно.

Еще одна мысль, вы уверены, что ваш URL-адрес REST должен быть "/ опросы"? В нашем приложении у нас есть отдельный URL-адрес для моделей, указанных в urlRoot.

Например, если Коллекция c имеет модели m1, m2,

c1 -> url (/ survey) - где опросы будут принимать коллекцию объектов

m1, m2 -> (/ survey) - где съемка примет модель (отдельный объект)

Надеюсь это поможет.

person Subbu    schedule 15.06.2014