У меня есть приложение 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);
}
});