6

出于多种原因,我需要通过 Ajax 向控制器发送一个发布请求,而我不能通过表单来完成它,它必须是一个 JS Ajax 请求,它写在 assets > javascript 的文件中或标签之间。

我编写了一个似乎可以正确传递数据的函数。但是,它没有传递有效的 Authenticity Token,因此不允许请求通过。

有没有办法遵守生成令牌的 CSRF 保护,以便控制器对此感到满意?

到目前为止,我的 Ajax 函数是:

  var functionOne = function() {
  var $form = $('#'  + tinyMCE.activeEditor.formElement.id);
  var action = $form.attr('action')
  $.ajax({
    method: "POST",
    url: action,
    data: $form.serialize(),
    dataType: 'script',
  });
};

此表单正在传递以下参数

{"utf8"=>"✓", "_method"=>"patch", "open_ender"=>
  {"answer_id"=>"4",
  "content"=>"<p>testing text</p>"},
  "id"=>"5"}

我尝试在 Ajax 对象中包含以下行

authenticity_token: $('meta[name=csrf-token]').attr('content'),

这在应用程序布局头中没有成功

$(function(){
  $.ajaxSetup({
  headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }
  });
});

更新

Appart 来自 Aniket 的解决方案。添加

authenticity_token: true 

在表单选项哈希中也解决了这个问题

4

2 回答 2

8

只需在表单中传递一个带有真实性令牌值的隐藏字段,这应该可以工作。

<%= f.hidden_field :authenticity_token, value: form_authenticity_token %>

或者

<input type=hidden name="authenticity_token" value="<%= form_authenticity_token %>">
于 2017-01-20T06:44:38.020 回答
0
Use the below:

  var functionOne = function() {
  var $form = $('#'  + tinyMCE.activeEditor.formElement.id);
  $form = $form.append('<input type = hidden name = "authenticity_token" value = "<%= form_authenticity_token %>">')
  var action = $form.attr('action')
  $.ajax({
    method: "POST",
    url: action,
    data: $form.serialize(),
    dataType: 'script',
  });
};
于 2017-01-20T06:49:11.223 回答