2017-01-20 48 views
2

由於以下幾個原因,我需要通過Ajax向控制器發送一個post請求,而且我無法做到涉及表單,它必須是在資產> javascript或標記之間的文件中寫入的JS Ajax請求。Rails如何在沒有涉及表單的情況下在Ajax請求中發送真實性令牌?

我寫了一個函數,似乎正確地傳遞數據。但是,它沒有傳遞有效的真實性令牌,因此不允許請求通過。

有沒有辦法符合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', 
    }); 
}; 

這種形式傳遞以下PARAMS

{"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') } 
    }); 
}); 

UPDATE Appart酒店從Aniket的解決方案

。在窗體選項哈希添加

authenticity_token: true 

解決問題以及

回答

4

只是通過一個隱藏字段真實性令牌的價值表單內,這應該工作。

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

OR

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

嗨Aniket,感謝它的工作原理。儘管我使用簡單的表單,但我添加了上面的代碼,Rails停止了投訴。但是,現在它指責** ActionController :: UnknownFormat **。這很奇怪,因爲表單設置爲remote:true,我的控制器正在用JS進行響應,如果我使用submit按鈕提交表單,它就可以工作。任何線索將是什麼問題。 – Andrew

+0

順便說一下,通過在表單的選項散列中添加authenticity_token:true,可以解決問題CSRF問題。這可能與tinyMCE的工作方式有關,它會干擾Rails創建真實標記的默認設置。顯然我太無知,不知道到底發生了什麼! – Andrew

+0

只要解決:) –

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', 
    }); 
}; 
+0

Chakreshwar,非常感謝您的答案。我以前使用Aniket的方法,它的工作。我喜歡在Ajax請求中追加隱藏字段的想法,使其更加整潔,儘管它不起作用。也許我不是完全追加在最後一個文件或什麼的。我試圖預先安排,但沒有成功。無論如何,幸運的是現在正在工作。謝謝 – Andrew

相關問題