2012-05-22 29 views
4

我決定只使用單個頁面加載實現我的Rails站點,並通過AJAX執行其他所有操作。問題是一旦用於提交註冊或登錄表單,在meta中生成的CSRF令牌就會失效。如何在不重新加載頁面的情況下更新它?使用AJAX在Rails上加載CSRF令牌

+0

使用getElementById或getElementsByTagName操作META標籤有什麼問題? –

+0

如果我在註冊前和註冊後使用同一個註冊,它會拒絕CSRF令牌。我想知道如何在沒有完整頁面重新加載的情況下更新令牌。 – Chris

回答

0

我不認爲在每一個請求(或者帖子或其他)之後,rails都會使CSRF元標記無效(如果沒有的話,像backbone.js這樣的框架會有困難:)。

https://github.com/rails/rails/blob/7fb99e5743d88c04357e09960d112376428a6faa/actionpack/lib/action_controller/metal/request_forgery_protection.rb#L100

你可能讓你覺得請求之前的請求是無效一個沒有正確的令牌,從而軌道刪除您的會話和後續的請求被標記,即使它們通過而先前爲無效正確的標記。

+0

正確,如果我想在不刷新頁面的情況下提出多個請求(表單提交),那會是什麼樣子? – Chris

0
每個Ajax請求

添加到數據:

authenticity_token: '<%= form_authenticity_token%>'

0

您可以在Ajax調用使用beforeSend像下面PUT,POST方法。 $.ajax({ type: 'POST', beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}, url: your url, data: data });