【发布时间】:2011-11-14 19:46:25
【问题描述】:
我有一个由 Rails 后端驱动的 Backbone 应用程序。我有一个Invitation 资源,我可以通过向邀请控制器的创建操作发送 POST 请求来发送邀请。
我的 Backbone 模型如下所示(coffeescript):
class Invitation extends Backbone.Model
urlRoot: '/invitations'
然后是发送邀请的表单模板。我试图让它尽可能接近正常的 Rails 形式,因为 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>
这是该模型和模板的主干视图
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],这是 rails 的标准。然而,在请求中两次发送姓名和电子邮件这一事实似乎表明我的设置有问题。
我做错了什么还是正确的?
如果有人想看,这是我的控制器操作:
# 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
编辑 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);
}
});
【问题讨论】:
-
如果您在模型上设置值,然后在 sendInvite 方法中调用
console.log(this.model),您会看到什么? -
hmmm...您是否偶然使用了自定义 Backbone.sync 方法?
-
不,我从来没有弄乱过 Backbone.sync。
-
模型中有哪些属性(
invitiation.attributes)?
标签: javascript ruby-on-rails ruby-on-rails-3 backbone.js javascript-framework