我用AJAXand发送数据从视图到控制器,我得到了这个错误:

警告:无法验证CSRF令牌的真实性

我想我必须用数据发送这个令牌。

有人知道我该怎么做吗?

编辑:我的解决方案

我通过在AJAX帖子中放入以下代码来做到这一点:

headers: {
  'X-Transaction': 'POST Example',
  'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},

当前回答

最好的方法实际上是使用<%= form_authenticity_token。To_s %>直接在rails代码中打印令牌。你不需要像其他文章提到的那样使用javascript来搜索dom中的csrf令牌。只需添加标题选项如下;

$.ajax({
  type: 'post',
  data: $(this).sortable('serialize'),
  headers: {
    'X-CSRF-Token': '<%= form_authenticity_token.to_s %>'
  },
  complete: function(request){},
  url: "<%= sort_widget_images_path(@widget) %>"
})

其他回答

我只是想把这个链接到这里,因为这篇文章有你想要的大部分答案,而且它也非常有趣

http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-just-have-to-tell-someone/

我为这个问题纠结了好几天。任何GET调用都正常工作,但所有put都会生成“无法验证CSRF令牌真实性”错误。在我向nginx添加SSL证书之前,我的网站工作正常。

我终于在nginx设置中发现了这一行:

location @puma { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off;
    proxy_set_header X-Forwarded-Proto https;   # Needed to avoid 'WARNING: Can't verify CSRF token authenticity'
    proxy_pass http://puma; 
}

在添加了缺失的行“proxy_set_header X-Forwarded-Proto https;”之后,我的所有CSRF令牌错误都退出了。

希望这能帮助那些也在用头撞墙的人。哈哈

如果我没记错的话,你必须添加以下代码到你的表单,以摆脱这个问题:

<%= token_tag(nil) %>

不要忘记参数。

您可以像下面这样全局地编写它。

JS:正常

$(function(){

    $('#loader').hide()
    $(document).ajaxStart(function() {
        $('#loader').show();
    })
    $(document).ajaxError(function() {
        alert("Something went wrong...")
        $('#loader').hide();
    })
    $(document).ajaxStop(function() {
        $('#loader').hide();
    });
    $.ajaxSetup({
        beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}
    });
});

咖啡脚本:

  $('#loader').hide()
  $(document).ajaxStart ->
    $('#loader').show()

  $(document).ajaxError ->
    alert("Something went wrong...")
    $('#loader').hide()

  $(document).ajaxStop ->
    $('#loader').hide()

  $.ajaxSetup {
    beforeSend: (xhr) ->
      xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
  }

确实是最简单的方法。不要费心更改头文件。

确保你有:

<%= csrf_meta_tag %> in your layouts/application.html.erb

只需要像这样做一个隐藏的输入字段:

<input name="authenticity_token" 
               type="hidden" 
               value="<%= form_authenticity_token %>"/>

或者如果你想要一个jQuery ajax的帖子:

$.ajax({     
    type: 'POST',
    url: "<%= someregistration_path %>",
    data: { "firstname": "text_data_1", "last_name": "text_data2", "authenticity_token": "<%= form_authenticity_token %>" },                                                                                  
    error: function( xhr ){ 
      alert("ERROR ON SUBMIT");
    },
    success: function( data ){ 
      //data response can contain what we want here...
      console.log("SUCCESS, data="+data);
    }
});