Backbone model.save()导致OPTIONS不是POST

时间:2014-10-05 16:43:47

标签: ruby-on-rails backbone.js typescript backbone-model

我有一个“创建帐户”视图,我正在开始工作。 Backbone 1.1.2(打字稿)前端,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');
    }
}

从上方model.save()输出Rails:

ActionController::RoutingError (No route matches [OPTIONS] "/accounts"):

我已经看到很多关于作为.save()的第一个参数传递的内容的问题,我每次都尝试了相同的结果:null, false, {}

我尝试使用相同的问题搜索问题但未能找到问题。在我采用覆盖.sync()方法之前,我想尝试让它在本地工作。

为什么.save()尝试使用OPTIONS代替POST

2 个答案:

答案 0 :(得分:3)

  

为什么.save()尝试使用OPTIONS而不是POST?

不是。这是CORS"预检请求"工作中。如果OPTIONS请求成功,则POST请求将跟随。

  

...预检请求作为HTTP OPTIONS请求(所以是   确保您的服务器能够响应此方法)。它还包含   一些额外的标题:

     

Access-Control-Request-Method - 实际请求的HTTP方法。   即使HTTP方法是a,也始终包含此请求标头   前面定义的简单HTTP方法(GET,POST,HEAD)。

     

Access-Control-Request-Headers - 以逗号分隔的非简单列表   请求中包含的标头。

     

预检请求是一种询问实际权限的方法   请求,在提出实际请求之前。服务器应检查   上面的两个标头验证了HTTP方法和   请求的标题有效且已被接受。

请参阅http://www.html5rocks.com/en/tutorials/cors/

答案 1 :(得分:0)

正如@meagar在回答这个问题时指出的那样,这并不是骨干试图做错的事情。这是一个CORS问题。我使用config.action_dispatch.default_headers.merge!手动设置了标题,但显然这还不够。

多一点谷歌搜索给了我一个回答的小宝石(得到它,'宝石')...... Rails RoutingError (No route matches [OPTIONS]

那里的答案引导我https://github.com/cyu/rack-cors

安装gem并根据其说明进行配置后,POST请求按预期进行。

希望这对未来的其他人有所帮助,并且一定要归功于@meagar帮助我走上正确的道路。