【问题标题】:How to succesfully save a json object recieved as POST- ruby on rails如何成功保存作为 POST-ruby on rails 接收的 json 对象
【发布时间】:2016-12-06 02:00:15
【问题描述】:

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

我使用了survey.js,它返回一个带有响应的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


  });

【问题讨论】:

  • 您能否验证您是否有此行:<%= csrf_meta_tag %> 在您的布局文件中的某处,例如application.html.erb

标签: ruby-on-rails json ajax csrf survey


【解决方案1】:

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

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

    $.ajax({ 类型:'POST', 发送前:函数(xhr){ return xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf token"]').attr('content')); }, 网址:“/调查/保存”, 数据:调查数据, 数据类型:JSON, 成功:警报(“已保存”) });

【讨论】:

  • 感谢您的回复,这似乎是我想做的,但我相信您的编辑是 Javascript,我使用 js2coffee 脚本转换器尝试了以下操作 恐怕什么都没发生,服务器没有吐出发送提交时的任何消息。 $.ajax({ type:'POST', beforeSend: setRequestHeader('X-CSRF-Token', $('meta[name="csrf token"]').attr('content')) url: "/surveys/save", data: survey.data, success: alert("saved"), dataType: JSON });
【解决方案2】:

解决方案正如 Abid 试图做的那样,但只是在咖啡脚本中声明标题。

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

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2021-11-29
    相关资源
    最近更新 更多