Das in der Rails-Sitzung gespeicherte Objekt wird zu einem String?

8

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

ändere

session_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?

    
Zack Chandler 10.04.2014, 04:32
quelle

3 Antworten

5

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.

    
tadman 10.04.2014 04:38
quelle
4

Fix ist, Serialisierung und Deserialisierung explizit manuell durchzuführen.

z.B.

%Vor%

Für shopify_app gem, siehe Dateiänderungen in der Pull-Anforderung Ссылка und entsprechend auf Ihre bestehenden anwenden App.

    
choonkeat 02.05.2014 14:08
quelle
0

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.

    
Jason M 20.04.2014 16:02
quelle