Rails Render JSON - сеанс потерян? - PullRequest
5 голосов
/ 15 декабря 2011

Я пытаюсь сделать несколько вызовов Ajax на контроллер, который отвечает JSON.

if session[:user]
  render :json => "Some Data"
else
  render :json => "You are not logged in"
end

В первый раз, когда это действие вызывается авторизованным пользователем, все в порядке, а session[:user] равно != nil. Во второй раз это называется nil!

Так что похоже, что rails теряет сессию, как только я render :json. Я понял, что при первом вызове рельсы заменяют *_session -дерево новым. Как следствие этого рельсы не знают о начальном сеансе аутентификации.

Если я не отображаю ответ как JSON, все работает нормально.

Как заставить rails устанавливать тот же идентификатор сеанса на страницах, отображаемых в формате JSON, что и в обычных представлениях?

Ответы [ 2 ]

9 голосов
/ 21 декабря 2011

После шести дней поиска я наконец сделал это:

Похоже, что rails уничтожает сессию из-за отсутствующего X-CSRF-Token Заголовка.Я добавляю этот заголовок в ajaxSend Hook of JQuery:

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

Теперь он работает как положено.

1 голос
/ 11 апреля 2012

Я положил это в метод beforeSend:

function goAjax(urlAddress,dataObject,successFunction,errorFunction){
        $.ajax({
              type: "POST",
              url: urlAddress,
              beforeSend: function ( xhr ) {
                    xhr.setRequestHeader("X-CSRF-Token", $('meta[name=csrf-token]').attr('content'));
              },
              dataType: "json",
              contentType: "application/json; charset=utf-8",
              processData: false,
              data: JSON.stringify(dataObject),
              context: document.body,
              success: function(data,status){ successFunction(data,status);},
              error: function(data,status){ errorFunction()}
        });
    }

прекрасно работает, если вам не нужно использовать другой способ запроса ajax (таким образом, вы должны добавить beforeSend ко всем запросам ajax)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...