2

保存特定骨干模型时,我注意到在检查服务器上的 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]* 下的内容?

*对不起,如果这更像是一个轨道问题而不是骨干问题。

4

1 回答 1

2

知道了!

attr_accessible当您更新或创建时,只有您在模型中标记的属性ActiveRecord::Base才会添加到嵌套模型的参数中。以前我有

class User < ActiveRecord::Base
  attr_accessible :first_name, :last_name, :email
end

因此,params[:user]仅包含允许批量分配的那些字段-:first_name和. 添加到该列表中解决了该问题,使我能够在控制器的操作中使用。:last_name:email:bio@user.update_attributes(params[:user])update

所以这不是 Backbone 问题,只是 Rails 配置问题。

于 2012-09-26T13:38:08.377 回答