2

特定のバックボーン モデルを保存するときに、サーバーで PUT 要求を調べたときに、フィールドの 1 つが欠落していることに気付きました。私はこのモデルを持っています:

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
});

そして、次のようにビューに保存します:

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フィールドは null にすることができますが、クライアント側のデバッガーを使用するdata = {...}と、save メソッドに送信される直前にオブジェクトに値があることがわかります。

> 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アクションで使用できるようになりました。

したがって、これはバックボーンの問題ではなく、Railsの構成だけです。

于 2012-09-26T13:38:08.377 に答える