1

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

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

关于为什么会发生这种情况的任何想法?

4

2 回答 2

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 的东西,是一本好书。基本上,Rails 会自动在您的页面中包含该令牌以确保您的应用程序安全。如果您检查站点的任何页面,您会在 HTML 文档的头部看到如下内容:

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

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

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

现在,这不是很有效,因为您每次发出请求时都在搜索该令牌。所以你应该做的是使用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)?你是如何声明你的路线的?因为如果我没记错的话,你可以使用相对 url 而不是绝对 url,你不需要根部分。这是一个例子:

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

# file.js
$.ajax({
    url: "relative_url",
    data: { param : 'something' }
});
于 2012-07-25T04:52:12.367 回答
0

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

于 2017-08-16T17:29:14.177 回答