2016-06-23 34 views
0

在我的Rails應用程序中,我試圖通過AJAX將JSON傳遞給控制器​​,但我遇到了401 (unauthorized)錯誤。我一直在研究這個,並試圖弄清楚我做錯了什麼,但我不太清楚。Rails - 401(未授權)錯誤 - JSON與AJAX控制器

首先,在AJAX本身 -

$.ajax({ 
    url: "report/submission", 
    type: "POST", 
    beforeSend: function(xhr) {xhr.setRequestHeader("X-CSRF-Token", $("meta[name='csrf-token']").attr("content"))}, 
    data: {"report" : reportParameter} 
}); 

這將數據傳遞到submission行動在Report控制器 -

class ReportController < ApplicationController 

    before_action :authenticate_user!, :only => [:submission] 

    def submission 
     INSERT ENTRIES TO DB, ETC 
    end 

end 

因此,也許一個複雜因素是,我需要before_action設計登錄。

所以基本過程是,用戶完成一個形式,條目被組裝成JSON(reportParameter),然後傳遞給submission行動需要登錄成功完成(我知道這可能會向後似乎,但它對這個特定的應用程序是必要的)。

我的佈局包括<%= csrf_meta_tags %>,我在application控制器中設置protect_from_forgery with: :null_session

我必須承認,我不明白這一點,以至於沒有更多的洞察力 - 我知道這是一個與CSRF令牌相關的授權問題,但我認爲在AJAX中設置beforeSend會解決這個問題。

任何指導將不勝感激。

+0

那麼,當用戶進行ajax調用時,他/她沒有登錄? – Uzbekjon

+0

是的,這是正確的。這個調用是在他們登錄前完成的,然後如果他們成功登錄,JSON的內容將被解析出來並記錄在DB中。 – skwidbreth

回答

0

如果您使用標準Rails窗體(form_tagform_for),那麼一個簡單的方法是使用jquery-ujs。它通常在application.js默認爲:

# application.js 
//= require jquery_ujs 

它會自動處理CSRF令牌,並增加了jQuery的ajax方法(要手動做的事情)。

如果你不想將application.js文件包含到你的頁面,那麼你可以簡單地包含jquery-ujs.js文件。

如果你不想這樣做,那麼我唯一能想到的就是你的表單使用的是「舊」或「不是最新」的csrf標記(緩存表單可能有它們) 。然後,確保隱藏表單中的csrf標記未被提交,或與您在請求標頭中發送的標記相匹配。 Here是給你一個我的意思的想法。

+0

是的,就是這樣。我試圖避免使用標準的Rails的'form_tag'和'form_for'。我有我的理由,但我想我可能需要重新思考這件事情的方式...... – skwidbreth

+0

在這種情況下,您可以簡單地將'jquery-ujs.js'添加到您的頁面,它應該做的伎倆。 – Uzbekjon

+0

我會測試它 - 會讓你知道它是否有效。感謝您的時間和專業知識。 – skwidbreth