路由错误:没有路由匹配[OPTIONS]

时间:2012-07-25 01:38:47

标签: ruby-on-rails ruby ajax

当我尝试设置请求标头令牌时,收到错误:

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

这是ajax调用:

  $.ajax({
    url: this.hostName + url,
    type: 'POST',
    data: data,
    dataType: 'json',
    beforeSend: function( xhr ) {
      xhr.setRequestHeader( 'X-CSRF-Token', $( 'meta[name="csrf-token"]' ).attr( 'content' ) );
    },
    success: function(response) {
      console.log('success');
      console.log(response);
    },
    error: function(response) {
      console.log('error');
      console.log(response);
    }
  });

如果我退出请求标题:

Started POST "/data" for 127.0.0.1 at 2012-07-24 18:37:22 -0700

但我收到警告说:

WARNING: Can't verify CSRF token authenticity

有关为何发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:1)

你试过吗

$.ajax({
    url: this.hostName + url,
    type: 'POST',
    headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }
    data: { param : 'something' },
    dataType: 'json'
});

然后在你的控制器中,params [:param]会给你'某事'。

如果您有兴趣知道为什么需要所有X-CSRF-Token内容,this是一个很好的阅读。基本上,Rails会自动在页面中包含该令牌,以确保您的应用程序安全。如果您检查网站的任何页面,您会在HTML文档的头部看到如下内容:

<meta content="guma1QdmO9Tn9SB4yV4DonkY4xf4Sy6lIvrFyHIaR1U=" name="csrf-token">

这是由<%= csrf_meta_tags %>文件中包含的行application.html.erb创建的。

Rails会在常规非GET请求中自动包含此令牌,以确保其安全。但是使用javascript和ajax,你必须通过使用jQuery函数$('meta[name="csrf-token"]'在DOM中搜索令牌来手动执行此操作。

现在,这不是很有效,因为您每次发出请求时都在搜索该令牌。所以你应该做的是使用ajaxSetup,如下所示:

$.ajaxSetup({
    type: 'POST',
    headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }
    dataType: 'json'
});

现在,无论何时您想发送请求,您只需要:

$.ajax({
    url: this.hostName + url,
    data: { param : 'something' }
});
编辑:啊,我明白了。你alert(this.hostName + url)做什么?你是如何宣布自己的路线的?因为如果我没记错,你可以使用相对网址而不是绝对网址,你不需要根部分。这是一个例子:

# routes.rb
post "relative_url" => 'controller#action'

# file.js
$.ajax({
    url: "relative_url",
    data: { param : 'something' }
});

答案 1 :(得分:1)

你应该尝试在ajax中提供相对url而不是绝对。我有同样的问题,并通过更改网址

工作