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

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

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

有人知道我该怎么做吗?

编辑:我的解决方案

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

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

当前回答

哎呀. .

我在我的application.js中漏掉了下面一行

//= require jquery_ujs

我把它换了,它还在工作。

=======更新=========

5年后,我又犯了同样的错误,现在我有了全新的Rails 5.1.6,我又找到了这篇文章。就像生命的循环。

现在的问题是 Rails 5.1默认删除了对jquery和jquery_ujs的支持

//= require rails-ujs in application.js

它做以下事情:

各种操作的强制确认对话框; 从超链接发出非get请求; 使用Ajax使表单或超链接异步提交数据; 在表单提交时自动禁用提交按钮,以防止双击。 (来自https://github.com/rails/rails-ujs/tree/master):

但为什么它不包括csrf令牌ajax请求?如果有人知道这个细节,请评论我。我很感激。

无论如何,我在我的自定义js文件中添加了以下内容以使其工作(感谢其他帮助我实现此代码的答案):

$( document ).ready(function() {
  $.ajaxSetup({
    headers: {
      'X-CSRF-Token': Rails.csrfToken()
    }
  });
  ----
  ----
});

其他回答

使用jquery。csrf (https://github.com/swordray/jquery.csrf)。

Rails 5.1或更高版本 添加jquery.csrf //= require jquery.csrf Rails 5.0或之前版本 来源“https://rails-assets.org”做 宝石的rails-assets-jquery.csrf 结束 //= require jquery.csrf 源代码 (函数(美元){ 美元(文档)。ajaxSend(函数(e, xhr,选项){ var牌= $(“元[name = " csrf-token]”).attr(“内容”); If (token) xhr。setRequestHeader(“X-CSRF-Token”,令牌); }); }) (jQuery);

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

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'))
  }

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

<%= token_tag(nil) %>

不要忘记参数。

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

确保你有:

<%= 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);
    }
});

如果有人需要与Uploadify和Rails 3.2相关的帮助(就像我在谷歌这篇文章时一样),这个示例应用程序可能会有帮助: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master/app/views/pictures/index.html.erb

也检查控制器解决方案在这个应用程序