Модель позвоночника без коллекции. Отправляете дубликаты данных на сервер?

У меня есть приложение Backbone, работающее на базе rails. У меня есть ресурс Invitation , и я могу отправлять приглашения, отправив запрос POST в действие create контроллера приглашения.

Моя модель Backbone выглядит так (coffeescript):

class Invitation extends Backbone.Model
  urlRoot: '/invitations'

И шаблон формы для отправки приглашения следует. Я попытался сделать его как можно ближе к обычным формам рельсов, поскольку кажется, что Rails справится с этим лучше всего:

<form action="/invitations" accept-charset="UTF-8" id="new_invitation" class="new_invitation" method="post">
  <input id="invitation_recipient_name" class="invitation_recipient_name" type="text" name="invitation[recipient_name]" />
  <input id="invitation_recipient_email" class="invitation_recipient_email" type="text" name="invitation[recipient_email]" />
  <input type="submit" class="btn primary" name="commit" id="invite" value="Send Invitation" />
</form>

Вот мой Backbone View для этой модели и шаблона

class InvitationView extends Backbone.View
  # this is the template shown above
  template: JST['backbone/templates/invitation']
  events:
    'click #invite': 'sendInvite'

  render: ->
    $(this.el).html this.template()
    this
  sendInvite: (e) ->
    e.preventDefault()
    name = this.$('#invitation_recipient_name')
    email = this.$('#invitation_recipient_email')
    this.model.save
      recipient_name: name.val()
      recipient_email: email.val()

Проблема в том, что когда я нажимаю кнопку отправки и вызывается метод sendInvite , мой сервер получает данные со следующей структурой:

Parameters: {"recipient_name"=>"A name", "recipient_email"=>"name@example.com", "invitation"=>{"recipient_email"=>"name@example.com", "recipient_name"=>"A name"}}

Теперь это действительно работает, поскольку мое действие invitations # create предполагает работу с параметрами объекта форма: params [: invitations] , это стандарт для рельсов. Однако тот факт, что имя и адрес электронной почты отправляются дважды в запросе, кажется признаком того, что что-то не так с моей настройкой.

Я делаю что-то не так или это правильно?

Вот действие моего контроллера, если кто-то хочет его увидеть:

  # POST /invitations
  def create
    @invitation = current_user.sent_invitations.new params[:invitation]

    respond_to do |format|
      if @invitation.save
        format.json { render_for_api :invitation, json: @invitation, status: :created }
      else
        format.json { render json: @invitation.errors, status: :unproccessible_entity }
      end
    end
  end

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

  Invitation
    _changed: false
    _changing: false
    _escapedAttributes: Object
      __proto__: Object
    _previousAttributes: Object
      recipient_email: "dave@example.com"
      recipient_name: "Dave"
      __proto__: Object
    attributes: Object
      recipient_email: "dave@example.com"
      recipient_name: "Dave"
      __proto__: Object
    cid: "c17"
    __proto__: ctor

Этот журнал создается следующим кодом, кстати:

sendInvite: (e) ->
    e.preventDefault()
    name = @$('#invitation_recipient_name')
    email = @$('#invitation_recipient_email')
    @model.set recipient_name: name.val(), recipient_email: email.val()
    console.log "THe model to save", @model

Edit 2
Вот как я создаю экземпляр своего представления в моем маршрутизаторе. Как мне изменить это, чтобы Backbone автоматически отслеживал атрибуты моих моделей, даже если я не получаю и не устанавливаю их с сервера?

  var TeamRouter = Backbone.Router.extend({
    routes: {
      'members': 'members'
    },

    members: function() {
      @invite = new MoveOutOrg.Models.Invitation();
      @inviteView = new MoveOutOrg.Views.InvitationView({
        model: @invite
      });
      $('#stage').append(@inviteView.render().el);
    }
  });
7
задан David Tuite 19 September 2011 в 13:49
поделиться