Рельсы не перезагружают сеанс на ajax post



Я испытываю очень странную проблему с Rails и ajax, используя jQuery (хотя я не думаю, что это специфично для jQuery).



мое приложение Rails использует хранилище сеансов cookie, и у меня есть очень простой логин, который устанавливает идентификатор пользователя в сеансе. Если user_id не задан в сеансе, он перенаправляется на страницу входа. Это работает без проблем. JQuery GET запросы работают нормально тоже. Проблема в том, что когда я делаю сообщение jQuery-браузер отправляет cookie сеанса ok (I подтвердил это с помощью Firebug и запроса на сброс.cookies в журнал), но сеанс пуст, т. е. сеанс {}.



Я делаю это в моем приложении.js:



$(document).ajaxSend(function(e, xhr, options) {
var token = $("meta[name='csrf-token']").attr('content');
xhr.setRequestHeader('X-CSRF-Token', token);
});


и вот мой пример поста:



$.post('/test/1', { _method: 'delete' }, null, 'json');


который должен попасть в этот метод контроллера (_method: delete):



def destroy
respond_to do |format|
format.json { render :json => { :destroyed => 'ok' }.to_json }
end
end


глядя на журнал и используя Firebug я могу подтвердить, что правильное значение cookie отправляется в заголовке запроса, когда происходит сообщение ajax, но кажется, что при некоторые точечные рельсы теряют это значение и поэтому теряют сеанс, поэтому он перенаправляется на страницу входа и никогда не попадает в метод.



Я пробовал все, что я могу придумать, чтобы отладить это, но я прихожу к мысли, что это может быть ошибка в Rails. Я использую Rails 3.0.4 и jQuery 1.5, если это поможет. Мне кажется очень странным, что регулярные (т. е. не ajax) запросы get и post работают, а запросы ajax get работают без проблем, это просто сообщения ajax, которые не надо.



помощь в попытке исправить это будет принята с благодарностью!



большое спасибо,

Дэйв

457   3  

3 ответов:

Я собираюсь ответить на мой собственный вопрос, как мне удалось выяснить, что происходит. Я опубликую его здесь, если это будет полезно кому-то еще!

после дальнейшего расследования, я понял, что код должно задает заголовок запроса с CSRF токен, не было. Это был исходный код:

$(document).ajaxSend(function(e, xhr, options) {
  var token = $("meta[name='csrf-token']").attr('content');
  xhr.setRequestHeader('X-CSRF-Token', token);
});

что происходило, так это то, что этот код не устанавливал заголовок, Rails получал запрос Ajax, токен не совпадал и это была перезагрузка сессии. Это использовалось для вызова ошибки ActionController:: InvalidAuthenticityToken (я полагаю, что я бы поймал это раньше, если бы была вызвана ошибка... Ну хорошо), но так как Rails 3.0.4 теперь просто тихо сбрасывает сеанс.

поэтому, чтобы отправить токен в заголовке, вы должны сделать это (большое спасибо это чудесное сообщение в блоге):

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

и теперь все работает как надо. И это хорошо.

Я нашел еще один случай:

вы установили 'csrf_meta_tag' в вашем файле макета приложения?

в моем случае, я не установил этот тег, и встретил ту же проблему с вашим.

и после установки csrf_meta_tag в app / views/layouts / application.формат html.Эрб, все работает отлично!

наконец, спасибо, что помогли мне найти первопричину ! спасибо большое ~

вот что официальный jQuery-ujs rails адаптер для серии 3.0. Вы должны помнить, чтобы держать его в курсе при обновлении версий rails, хотя.

для меня, обновлении с 3.0.3 до 3.0.8.rc4 означало также ручную выборку src/rails.js файл из связанного РЕПО.

поскольку Rails 3.1 наконец-то переключился на jQuery, в будущем все должно автоматически обновляться через jQuery-rails gem при обновлении rails (и использовании встроенного актива 3.1 трубопровод)

Comments

    Ничего не найдено.