복붙노트

[RUBY-ON-RAILS] 아약스 게시물에 세션을 다시로드하지 난간

RUBY-ON-RAILS

아약스 게시물에 세션을 다시로드하지 난간

나는 레일과 아주 이상한 문제가 발생하고 (내가 jQuery를에 그것의 구체적인 생각하지 않지만) 아약스 jQuery를 사용하고 있습니다.

내 레일 응용 프로그램은 쿠키 세션 저장소를 사용하고 난 세션에서 사용자 ID를 설정하는 매우 간단한 로그인을해야합니다. USER_ID가 세션에 설정되어 있지 않은 경우, 로그인 페이지로 리디렉션합니다. 이 문제없이 작동합니다. JQuery와 GET 너무 잘 작동을 요청합니다. 브라우저는 세션 쿠키 확인 (나는 방화범이 끌려와 로그에 덤프 request.cookies로를 확인) 전송하지만, 세션 즉 세션이 {}이다, 비어 - 나는 jQuery를 POST를 수행 할 때 문제입니다.

내 application.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)에 도착한다 :

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

이 로그인 리디렉션 있도록 로그를 찾고, 그리고 방화범 나는 아약스 포스트가 발생했을 때 올바른 쿠키 값이 요청 헤더에 전송되는 것을 확인할 수 있습니다 사용하지만, 따라서 어느 시점이 레일에서이 값을 잃는 것으로 보인다 것은 세션을 잃는다 결코 페이지 및 방법에 가져옵니다.

나는이 디버깅을 생각할 수있는 모든 노력을했지만 나는이 레일에서 버그가 수 수 있다는 생각에 주위에 간다. 그 도움이된다면 나는 레일 3.0.4와 jQuery를 1.5을 사용하고 있습니다. 나는 GET 및 사후 요청 작업을 정기적으로 (즉, 비 아약스)이 매우 이상한 찾아 아약스 GET 아무런 문제없이 작업을 요청, 그것은하지 않습니다 아약스 게시물은입니다.

이 문제를 해결하기 위해 노력에 어떤 도움을 주시면 감사하겠습니다!

많은 감사합니다, 데이브

해결법

  1. ==============================

    1.내가 무슨 일이 있었는지 해결하기 위해 관리했습니다 나는 내 자신의 질문에 대답하는거야. 나는 그것이 다른 사람에게 유용의 경우에는 여기에 게시거야!

    내가 무슨 일이 있었는지 해결하기 위해 관리했습니다 나는 내 자신의 질문에 대답하는거야. 나는 그것이 다른 사람에게 유용의 경우에는 여기에 게시거야!

    추가 조사 후, 나는 CSRF 토큰을 요청 헤더를 설정해야했는데 코드가 아니었다 있다고했다. 이것은 원래의 코드했다 :

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

    무슨 일이 일어 났는지이 코드 레일, 토큰이 일치하지 Ajax 요청을 수신하고, 헤더를 설정하지 않는 한 그것은 세션을 재설정 된 것이 었습니다. 이것은 (내가 아니라 오 ... 내가이 이전에 오류가 발생 된 경우 잡은 것이다 가정)을 ActionController :: InvalidAuthenticityToken 오류를 발생하는 데 사용하지만, 레일 3.0.4 이후 지금 조용히 세션을 다시 설정합니다.

    그래서 헤더에 토큰을 보내려면 (이 놀라운 블로그 게시물에 많은 감사)이 작업을 수행해야합니다 :

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

    그리고 지금 모두가 정상적으로 작동합니다. 어떤 좋은 것입니다.

  2. ==============================

    2.나는 또 다른 사례를 발견 :

    나는 또 다른 사례를 발견 :

    당신은 당신의 애플리케이션 레이아웃 파일에서 'csrf_meta_tag'을 설정?

    내 경우에는, 그 태그를 설정하지 않았고, 당신과 같은 문제를 만났다.

    레이아웃 / application.html.erb, 모든 것이 잘 작동 / 그리고 응용 프로그램에 csrf_meta_tag을 설정 한 후 / 전망!

    마지막으로, 내가 근본 원인을 찾아 도와 주셔서 감사합니다! 덕분에 많이 ~

  3. ==============================

    3.공식 JQuery와 - UJS 어댑터 레일 무슨의는 3.0 시리즈입니다. 당신은 업그레이드 그래도 버전 레일 때 업데이트 유지하기 위해 기억해야합니다.

    공식 JQuery와 - UJS 어댑터 레일 무슨의는 3.0 시리즈입니다. 당신은 업그레이드 그래도 버전 레일 때 업데이트 유지하기 위해 기억해야합니다.

    나를 위해, 3.0.3에서 3.0.8.rc4로 업그레이드 수동으로 SRC를 가져 오는 또한 의미 / 링크의 repo에서 파일을 rails.js.

    를 통해 미래의 레일 3.1 마침내 jQuery를 스위치를 만든 이후, 일을해야 자동 업데이트 JQuery와 - 레일 보석 레일을 업데이트 할 때 (그리고 3.1을 사용하여 내장 된 자산 파이프 라인)

  4. from https://stackoverflow.com/questions/5126721/rails-not-reloading-session-on-ajax-post by cc-by-sa and MIT license