Normalerweise würde ich keine Objekte in einer Rails-Sitzung speichern, aber ich verwende eine Bibliothek, die dies erfordert. Ich bin auf ein sehr seltsames Problem gestoßen, bei dem ein gespeichertes Objekt nach der Weiterleitung als String erscheint.
Zum Reproduzieren habe ich eine Beispiel-Rails 4.1 App erstellt
$ rails new session-test
Testcontroller hinzugefügt:
%Vor%Setup-Routen:
%Vor%Dann starte ich Schienen
$ bundle exec rails server
und drücken Sie localhost: 3000 / home / von im Browser:
%Vor%Ich habe keine Ahnung, warum dieses Objekt als String übersetzt wird ...
Es scheint mit dem Sitzungsspeichertyp von cookie_store zu tun zu haben, denn wenn ich
änderesession_store.rb von
Rails.application.config.session_store :cookie_store, key: '_session-test_session'
bis
Rails.application.config.session_store :cache_store
es funktioniert!
Irgendwelche Ideen?
Sie können keine Objekte in der Rails-Sitzung speichern. Es handelt sich um einen Schlüsselwertspeicher, der nur Zeichenfolgen akzeptiert, da er meist verpackt und als verschlüsselter Cookie an den Client gesendet wird.
Es ist keine Müllhalde für Dinge, die Sie brauchen könnten. Achten Sie darauf, wie viel Müll Sie dort hineinstopfen, denn je mehr Sie sich auf die Sitzung konzentrieren, desto größer ist der Cookie, den der Client für jede Anfrage an Ihren Server schicken muss.
Es lohnt sich, die Header im Netzwerkinspektionstool Ihres Browsers zu beobachten, um zu sehen, wie stark Ihre Anfragen sind.
Wenn Sie wirklich etwas darin aufbewahren müssen, verwenden Sie ein zeichenkettenfreundliches Kodierungsformat wie JSON, um sicher zu gehen, dass Sie die Daten in einem verwendbaren Format wiederfinden.
Ich würde auch sehr zögerlich sein, das cache_store
zu verwenden, das nicht über verschiedene Instanzen Ihrer Anwendung verteilt wird. Ruby-Objekte existieren nur im Kontext eines einzelnen Prozesses, so dass andere Anfragen, die meistens zufällige Prozesse betreffen, nicht so einfach dazu in der Lage sind.
Der Standard-Cookie-Speicher ist der zuverlässigste. Die anderen, die sich zwischen Prozessen teilen, sind davon abhängig, dass zusätzliche Dienste betriebsbereit sind (Memcached, Redis, etc.), aber die meisten von diesen diktieren auch eine Nur-Zeichen-Richtlinie.
Ich hatte das gleiche Problem mit meiner Shopify-App und habe viel Zeit damit verbracht, es zu debuggen. Basierend auf Tadmans genauer, wenn nicht dogmatischer Erklärung, war ich in der Lage, das Mars Session-Objekt zu umgehen. Es wurden nur 3 Zeilen Code benötigt, um zu ändern:
login_protection.rb: 12: ShopifyAPI :: Base.activate_session (Marschall :: load session [: shopify]) login_protection.rb: 25: Marshal :: load session [: shopify]
sessions_controller.rb: 13: session [: shopify] = Marshal :: dump (sess)
Ich habe dies im Shopify-Forum gepostet und erwarte, dass sie bald ein Update veröffentlichen werden. Für das, was es wert ist, denke ich, dass der alte Weg, obwohl er philosophisch "falsch" war, in jeder Version von Rails bis 4.1 richtig funktioniert hat.
Tags und Links ruby-on-rails session ruby-on-rails-4 ruby-on-rails-4.1 shopify