我正在尝试使用Backbone 1.1.2和Rails 4.2.beta1创建用户帐户。
在主干我打电话:
public create(){
var email:string = $('#create-account-email').val(), password:string = $('#create-account-password').val(), passconf:string = $('#create-account-password-confirm').val();
this.model.set({email: email, password: password, password_confirmation: passconf});
this.model.save(null, {success: this.success, error: this.error});
}
使用以下请求参数正确调用web服务中的rails create
方法:
{"email":"test@test.com","password":"123456","password_confirmation":"123456"}
它正在通过过滤方法
def account_params
#breakpoint
params.require(:account).permit(:password, :password_confirmation, :email)
end
但是如果我在上面提到的地点放置一个断点并检查我得到的params
物体:
{"email"=>"test@test.com",
"password"=>"123456",
"password_confirmation"=>"123456",
"controller"=>"accounts",
"action"=>"create",
"account"=>{"email"=>"test@test.com"},
"format"=>"json"}
乍一看,这对我来说是正确的。但帐户创建失败,因为密码为nil
如果检查account_params
的结果我只得到:
{"email" => "test@test.com")
为什么密码未包含在帐户参数对象中。我使用所有默认的sacaffolded代码和rails以及Backbone的默认配置。
答案 0 :(得分:0)
我找到了一个红宝石宝石backbone-rails的GitHub仓库,并使用了包含here的同步覆盖。
Backbone._sync = Backbone.sync;
Backbone.sync = function (method:string, model:Backbone.Model, options?: any){
if(options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
options.contentType = 'application/json';
var data:any = JSON.stringify(options.attrs || model.toJSON(options));
if(model.paramRoot) {
data = {};
data[model.paramRoot] = model.toJSON(options);
} else {
data = model.toJSON();
}
options.data = JSON.stringify(data);
}
return Backbone._sync(method, model, options);
}
我删除了一些我不需要的项目,但这会将主干属性包装到一个对象中,并以所需的格式将其发送到rails应用程序。
所以参数:
{"email":"test@test.com",
"password":"123456",
"password_confirmation":"123456"}
成为:
{"account":
{"email":"test@test.com",
"password":"123456",
"password_confirmation":"123456"}
}
这不是一点点修改骨干应用程序代码......
当我使用打字稿时,我必须使用以下签名将_sync()
方法添加到backbone.d.ts
文件中。
declare module Backbone {
function _sync(method: string, model: Model, options?: JQueryAjaxSettings):any;
...
}
我还需要将以下内容添加到Backbone.Model
class Model extends ModelBase implements OptionalDefaults {
paramRoot: string;
...
}
然后我将paramRoot
属性添加到我的模型中:
export class Account extends Backbone.Model {
public urlRoot: string;
public validation:any;
public paramRoot:string;
constructor(attributes?: any, options?: any){
this.paramRoot = 'account';
this.urlRoot = 'http://mydomain.fake/accounts';
this.validation = {
email: {
required: true,
pattern: 'email'
},
password: {
required: true,
minLength: 6
}
};
super(attributes, options);
}
}
还有其他方法可以让_sync()
方法和paramRoot
属性在不修改backbone.d.ts
文件的情况下传递编译器错误,而是扩展对象并将其添加到另一个.d.ts
1}}文件。但这对我来说没问题,因为我打算在未来的项目中使用它,我不介意稍微修改.d.ts
文件。
希望这有助于将来。