Ruby on rails 主干模型.save()导致选项不过帐

Ruby on rails 主干模型.save()导致选项不过帐,ruby-on-rails,backbone.js,typescript,backbone-model,Ruby On Rails,Backbone.js,Typescript,Backbone Model,我有一个“创建帐户”的观点,我正在着手研究。主干1.1.2(typescript)前端,Rails 4.2 beta 1 web服务后端 账户模式 export class Account extends Backbone.Model { public urlRoot: string; public validation:any; constructor(attributes?: any, options?: any){ this.urlRoot = '

我有一个“创建帐户”的观点,我正在着手研究。主干1.1.2(typescript)前端,Rails 4.2 beta 1 web服务后端

账户模式

export class Account extends Backbone.Model {
    public urlRoot: string;
    public validation:any;

    constructor(attributes?: any, options?: any){
        this.urlRoot = 'http://domain.fake/accounts';
        this.validation = {
            email: {
                required: true,
                pattern: 'email'
            },
            password: {
                required: true,
                minLength: 6
            }
        };
        super(attributes, options);
    }
}
创建帐户视图:

export class CreateAccountView extends Backbone.View {
    public template: string;
    public events: any;
    public model: accountModelImport.Account;

    constructor(options?: Backbone.ViewOptions){
        this.el = '#modal';
        this.template = createAccountViewTemplate;
        this.model = new accountModelImport.Account();
        this.events = {
            'click #create-account-submit' : 'create'
        };
        super(options);
    }

    public render(): CreateAccountView {
        this.$el.html(_.template(this.template));
        Backbone.Validation.bind(this);
        this.$el.modal('show');
        return this;
    }

    public create(){
        var email:string = $('#create-account-email').val(), password:string = $('#create-account-password').val(), passconf:string = $('#create-account-password-confirmation').val();
        this.model.set({email: email, password: password, password_confirmation: passconf});
        this.model.save(null, {success: this.success, error: this.error});
    }

    public success(){
        alert('Success');
    }

    public error(){
        alert('error');
    }
}
ActionController::RoutingError (No route matches [OPTIONS] "/accounts"):
Rails在
model.save()上的输出。
从上面开始:

export class CreateAccountView extends Backbone.View {
    public template: string;
    public events: any;
    public model: accountModelImport.Account;

    constructor(options?: Backbone.ViewOptions){
        this.el = '#modal';
        this.template = createAccountViewTemplate;
        this.model = new accountModelImport.Account();
        this.events = {
            'click #create-account-submit' : 'create'
        };
        super(options);
    }

    public render(): CreateAccountView {
        this.$el.html(_.template(this.template));
        Backbone.Validation.bind(this);
        this.$el.modal('show');
        return this;
    }

    public create(){
        var email:string = $('#create-account-email').val(), password:string = $('#create-account-password').val(), passconf:string = $('#create-account-password-confirmation').val();
        this.model.set({email: email, password: password, password_confirmation: passconf});
        this.model.save(null, {success: this.success, error: this.error});
    }

    public success(){
        alert('Success');
    }

    public error(){
        alert('error');
    }
}
ActionController::RoutingError (No route matches [OPTIONS] "/accounts"):
我看到了许多关于将什么作为第一个参数传递给
.save()
的问题,每次我都尝试了它们,结果都是一样的:
null,false,{}

我尝试过搜索一个有相同问题的问题,但没有找到一个。在重写
.sync()
方法之前,我想尝试让它在本机上工作

为什么
.save()
试图使用
选项
而不是
发布

为什么.save()尝试使用选项而不是POST

不是。这是CORS的“飞行前请求”。如果选项请求成功,POST请求将随之出现

…飞行前请求是作为HTTP选项请求发出的(因此 确保您的服务器能够响应此方法)。它还包含 一些附加标题:

访问控制请求方法-实际请求的HTTP方法。 始终包含此请求头,即使HTTP方法是 前面定义的简单HTTP方法(GET、POST、HEAD)

访问控制请求标头-以逗号分隔的非简单 请求中包含的标题

飞行前请求是为实际飞行请求权限的一种方式 请求,然后再提出实际请求。服务器应该检查 上面的两个标头用于验证HTTP方法和 请求的标头有效且已接受

为什么.save()尝试使用选项而不是POST

不是。这是CORS的“飞行前请求”。如果选项请求成功,POST请求将随之出现

…飞行前请求是作为HTTP选项请求发出的(因此 确保您的服务器能够响应此方法)。它还包含 一些附加标题:

访问控制请求方法-实际请求的HTTP方法。 始终包含此请求头,即使HTTP方法是 前面定义的简单HTTP方法(GET、POST、HEAD)

访问控制请求标头-以逗号分隔的非简单 请求中包含的标题

飞行前请求是为实际飞行请求权限的一种方式 请求,然后再提出实际请求。服务器应该检查 上面的两个标头用于验证HTTP方法和 请求的标头有效且已接受

为什么.save()尝试使用选项而不是POST

不是。这是CORS的“飞行前请求”。如果选项请求成功,POST请求将随之出现

…飞行前请求是作为HTTP选项请求发出的(因此 确保您的服务器能够响应此方法)。它还包含 一些附加标题:

访问控制请求方法-实际请求的HTTP方法。 始终包含此请求头,即使HTTP方法是 前面定义的简单HTTP方法(GET、POST、HEAD)

访问控制请求标头-以逗号分隔的非简单 请求中包含的标题

飞行前请求是为实际飞行请求权限的一种方式 请求,然后再提出实际请求。服务器应该检查 上面的两个标头用于验证HTTP方法和 请求的标头有效且已接受

为什么.save()尝试使用选项而不是POST

不是。这是CORS的“飞行前请求”。如果选项请求成功,POST请求将随之出现

…飞行前请求是作为HTTP选项请求发出的(因此 确保您的服务器能够响应此方法)。它还包含 一些附加标题:

访问控制请求方法-实际请求的HTTP方法。 始终包含此请求头,即使HTTP方法是 前面定义的简单HTTP方法(GET、POST、HEAD)

访问控制请求标头-以逗号分隔的非简单 请求中包含的标题

飞行前请求是为实际飞行请求权限的一种方式 请求,然后再提出实际请求。服务器应该检查 上面的两个标头用于验证HTTP方法和 请求的标头有效且已接受


参见

正如@meagar在回答这个问题时指出的,这并不是主干试图做的任何错事。这是CORS的问题。我使用
config.action\u dispatch.default\u headers.merge手动设置了标题
更多的谷歌搜索为我提供了一个小小的宝石般的答案(得到它,'gem')。。。

这就是我的答案

安装gem并按照他们的说明进行配置后,
POST
请求按预期进行


希望这对将来的其他人有所帮助,并且一定要赞扬@meagar帮助我走上了正确的道路。

正如@meagar在回答这个问题时指出的那样,主干并没有试图做错事。这是CORS的问题。我使用
config.action\u dispatch.default\u headers.merge手动设置了标题
更多的谷歌搜索为我提供了一个小小的宝石般的答案(得到它,'gem')。。。

这就是我的答案

安装gem并按照他们的说明进行配置后,
POST
请求按预期进行