Rails lädt Sitzung auf Ajax-Post nicht neu

Lesezeit: 3 Minuten

Ich habe ein sehr seltsames Problem mit Rails und Ajax bei der Verwendung von jQuery (obwohl ich nicht glaube, dass es spezifisch für jQuery ist).

Meine Rails-Anwendung verwendet den Cookie-Sitzungsspeicher, und ich habe eine sehr einfache Anmeldung, die die Benutzer-ID in der Sitzung festlegt. Wenn die user_id in der Sitzung nicht festgelegt ist, wird sie auf eine Anmeldeseite umgeleitet. Das funktioniert ohne Probleme. JQuery GET-Anfragen funktionieren auch gut. Das Problem ist, wenn ich einen jQuery POST mache – der Browser sendet das Sitzungscookie ok (ich habe dies mit Firebug bestätigt und request.cookies in das Protokoll geschrieben), aber die Sitzung ist leer, dh die Sitzung ist {}.

Ich mache das in meiner application.js:

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

und hier ist mein Beispielbeitrag:

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

was zu dieser Controller-Methode gelangen soll (_method: delete):

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

Wenn ich mir das Protokoll ansehe und Firebug verwende, kann ich bestätigen, dass der korrekte Cookie-Wert im Anforderungsheader gesendet wird, wenn der Ajax-Post auftritt, aber es scheint, dass Rails irgendwann diesen Wert verliert und daher die Sitzung verliert, sodass es zum Login umleitet Seite und gelangt nie zur Methode.

Ich habe alles versucht, was ich mir vorstellen kann, um dies zu debuggen, aber ich komme auf die Idee, dass dies ein Fehler in Rails sein könnte. Ich verwende Rails 3.0.4 und jQuery 1.5, falls das hilft. Ich finde es sehr seltsam, dass normale (dh Nicht-Ajax) Get- und Post-Anfragen funktionieren und Ajax-Get-Anfragen ohne Probleme funktionieren, es sind nur die Ajax-Posts, die dies nicht tun.

Jede Hilfe bei dem Versuch, dies zu beheben, wäre sehr dankbar!

Vielen Dank,
David

Ich werde meine eigene Frage beantworten, da ich herausgefunden habe, was los war. Ich werde es hier posten, falls es für jemand anderen nützlich ist!

Nachdem ich weiter nachgeforscht hatte, fand ich heraus, dass der Code das war angeblich den Anforderungsheader mit dem CSRF-Token zu setzen, war es nicht. Dies war der ursprüngliche Code:

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

Was passierte, war, dass dieser Code den Header nicht setzte, Rails eine Ajax-Anfrage erhielt, das Token nicht übereinstimmte und die Sitzung zurückgesetzt wurde. Früher löste dies einen ActionController::InvalidAuthenticityToken-Fehler aus (ich nehme an, ich hätte das früher bemerkt, wenn ein Fehler aufgetreten wäre … na ja), aber seit Rails 3.0.4 wird die Sitzung jetzt einfach stillschweigend zurückgesetzt.

Um den Token im Header zu senden, müssen Sie dies tun (vielen Dank an diesen wunderbaren Blogbeitrag):

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

Und jetzt funktioniert alles wie es soll. Was nett ist.

Ich habe noch einen Fall gefunden:

Haben Sie das ‘csrf_meta_tag’ in Ihrer Anwendungslayoutdatei festgelegt?

In meinem Fall habe ich dieses Tag nicht gesetzt und bin bei Ihrem auf das gleiche Problem gestoßen.

Und nach dem Setzen des csrf_meta_tags in app/views/layouts/application.html.erb funktioniert alles einwandfrei!

Endlich danke, dass Sie mir geholfen haben, die Ursache zu finden! vielen dank ~

Das ist, was die offizieller jquery-ujs-Schienenadapter ist für in der 3.0-Serie. Sie müssen jedoch daran denken, es auf dem neuesten Stand zu halten, wenn Sie Rail-Versionen aktualisieren.

Für mich bedeutete das Upgrade von 3.0.3 auf 3.0.8.rc4 auch das manuelle Abrufen der src/rails.js Datei aus dem verknüpften Repo.

Da Rails 3.1 endlich auf jQuery umgestellt hat, sollten die Dinge in Zukunft automatisch über das Juwel jquery-rails aktualisiert werden, wenn Rails aktualisiert werden (und die integrierte Asset-Pipeline von 3.1 verwendet wird).

Wenn Sie nach dem Senden immer noch Probleme haben csrf_meta_tag richtig an den Server. Stellen Sie sicher, dass die Konfiguration Ihres Sitzungsspeichers korrekt ist.

Wenn die :secure in Ihrem auf true gesetzt ist session_store.rb, wird das Cookie (Session) nicht an Ihren http-Server übertragen. Dokumente: https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html

.

619950cookie-checkRails lädt Sitzung auf Ajax-Post nicht neu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy