如何在 rails 上成功保存作为 POST- ruby 收到的 json 对象

How to succesfully save a json object recieved as POST- ruby on rails

我正在尝试创建一个允许用户提交评论的应用程序。

我使用 survey.js 其中 returns 一个带有响应的 json 对象,这里是将请求发送到所需 url 的咖啡脚本文件:

$.ajax({
  type:'POST',
  url: "/surveys/save",
  data: survey.data,
  success: alert("saved"),
  dataType: JSON

在我的控制器中,我尝试保存适当的参数:

def create
    if validate_user
      @submission = Submission.new(submission_params)
      if @submission.save
        redirect_to '/surveys/saved'
      else
        redirect_to '/surveys/nosaved'
      end
    end
end

但是我从服务器看到这个输出:

"Started POST "/surveys/save" for ::1 at 2016-08-01 00:21:47 -0400
Processing by SurveysController#create as */*
  Parameters: {"question1"=>"eh", "question2"=>"1", "question3"=>"3", "question4"=>"1", "question5"=>"1", "question6"=>"3", "question7"=>"4", "question8"=>"1", "question9"=>"2", "question10"=>"1"}
Can't verify CSRF token authenticity"

请告知,根据我的研究,我似乎需要在我的请求前添加真实性令牌,但我不确定该怎么做。

谢谢!

****更新**

我的应用程序布局文件中确实有 CSRF 元标记

******更新 2*******

我在 Coffee 脚本中尝试了以下操作,结果相同。

$.ajax({
  type:'POST',
  beforeSend: test = (xhr)-> return xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf token"]').attr('content'))
  url: "/surveys/save",
  data: survey.data,
  success: alert("saved"),
  dataType: JSON


  });

以下步骤将为您解决问题。

  1. 确保您的应用程序布局文件中有 csrf_meta 标记。
  2. 将 beforeSend 添加到所有 ajax 请求以设置 header 如下所示。

    $.ajax({ 类型:'POST', 发送前:函数(xhr){ return xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf token"]').attr('content')); }, url: "/surveys/save", 数据:survey.data, 数据类型:JSON, 成功:警报("saved") });

解决方案与 Abid 尝试做的一样,但只需在咖啡脚本中声明 header。

  $.ajax({
    type:'POST',
    headers: {'X-CSRF-Token': $('meta[name="csrf token"]').attr('content')},
    url: "/surveys/save",
    data: survey.data,
    success: alert("saved"),
    dataType: JSON
    })