保存特定骨干模型时,我注意到在检查服务器上的 PUT 请求时缺少其中一个字段。我有这个模型:
App.Models.User = Backbone.Model.extend({
name: "user",
url: function() {
u = "/users"
if ( this.id ) {
u += "/" + this.id;
}
return u;
}
});
App.Collections.Users = Backbone.Collection.extend({
urlRoot: "/users",
model: App.Models.User
});
我把它保存在 View 上,如下所示:
App.Views.EditUserForm = Backbone.View.extend({
events: {
"submit": "saveUser"
},
saveUser: function(e) {
e.preventDefault();
var _id = this.$("#user_id").val();
var data = {
id: ( _id !== '' ) ? _id : null,
first_name: this.$("#user_first_name").val(),
last_name: this.$("#user_last_name").val(),
email: this.$("#user_email").val(),
bio: this.$("#user_bio").val()
};
var _this = this;
var user = new App.Models.User();
// This will create or update a user
// record on the server
user.save(data,{
success: _this.handleSuccess,
error: _this.handleErrors
});
},
handleSuccess: function(user, resp) { /* ... */ },
handleErrors: function(user, resp) { /* ... */ }
});
但是,当我到达服务器端(Rails)时,该bio
字段不在请求的参数中:
(debugger) params[:user].keys
[ "first_name", "last_name", "email" ]
该bio
字段允许为空,但使用客户端调试器我可以看到它在data = {...}
发送到保存方法之前在对象中有一个值。
> data.bio
"something, somthing, dark side"
我还可以看到,当我使用集合来获取服务器上的现有对象时,该字段可用并已填充。只有 'model.save()' 方法在沿途某处删除该值。任何想法为什么?谢谢。
更新 -
我可以看到该bio
字段已发送到服务器,但它不在params[:user]
params 哈希的根目录下,而是在根目录下:
(debugger) ap params
{
"id" => "1",
"first_name" => "John",
"last_name" => "Doe",
"email" => "john@bleh.com",
"bio" => "something, somthing, dark side",
"user" => {
"first_name" => "John",
"last_name" => "Doe",
"email" => "john@bleh.com",
},
"controller" => "users",
"action" => "update"
}
什么决定了 params[:user]* 下的内容?
*对不起,如果这更像是一个轨道问题而不是骨干问题。