Эта проблема не связана с Devise. Вкратце, начиная с Rails 3.0.4 требуется, чтобы каждый не-GET-запрос имел токен CSRF, в противном случае сеанс очищается.
В этом есть два основных изменения
исправить поведение при CSRF
защита не изменилась, и
токен теперь потребуется для всех
запросы не GET.
После применения этого патча произошел сбой CSRF
запросы больше не будут генерировать HTTP
500 ошибок, вместо сеанса
сбросить . Пользователи могут переопределить это
поведение путем переопределения
handle_unverified_request в своем собственном
контроллеры.
Подробнее здесь: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails
Фрагмент jQuery для использования с вашими запросами AJAX
$(document).ajaxSend(function(e, xhr, options) {
var token = $("meta[name='csrf-token']").attr("content");
xhr.setRequestHeader("X-CSRF-Token", token);
});
Если вы используете прототип, вам понадобится следующий код:
Ajax.Responders.register({
onCreate: function(request) {
var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
if (csrf_meta_tag) {
var header = 'X-CSRF-Token',
token = csrf_meta_tag.readAttribute('content');
if (!request.options.requestHeaders) {
request.options.requestHeaders = {};
}
request.options.requestHeaders[header] = token;
}
}
});