Normalmente non memorizzerei oggetti in una sessione di Rails ma sto usando una libreria che richiede questo. Ho avuto un problema molto strano in cui un oggetto memorizzato appare come una stringa dopo il reindirizzamento.L'oggetto memorizzato nella sessione di Rails diventa una stringa?
di riprodurre ho creato un campione Rails 4.1 app
$ rails new session-test
Aggiunto un controller di test:
class HomeController < ApplicationController
def index
logger.debug "session[:customer]: #{session[:customer]}"
logger.debug "session[:customer].name: #{session[:customer].name}"
end
def from
Struct.new 'Customer', :name, :address
session[:customer] = Struct::Customer.new 'Dave', '123 Main'
redirect_to :action => :index
end
end
percorsi di impostazione:
Rails.application.routes.draw do
get 'home/index'
get 'home/from'
root 'home#index'
end
Poi apro il Rotaie
$ bundle exec rails server
e ha colpito localhost: 3000/home/da nel browser:
Started GET "/home/from" for 127.0.0.1 at 2014-04-09 21:20:25 -0700
Processing by HomeController#from as HTML
Redirected to http://localhost:3000/home/index
Completed 302 Found in 18ms (ActiveRecord: 0.0ms)
Started GET "/home/index" for 127.0.0.1 at 2014-04-09 21:20:25 -0700
Processing by HomeController#index as HTML
session[:customer]: #<struct Struct::Customer name="Dave", address="123 Main">
Completed 500 Internal Server Error in 2ms
NoMethodError (undefined method `name' for "#<struct Struct::Customer name=\"Dave\", address=\"123 Main\">":String):
app/controllers/home_controller.rb:4:in `index'
Non ho idea del perché questo oggetto è sempre tradotto come una stringa ...
Sembra di avere a che fare con il tipo di archivio di sessione di cookie_store perché se cambio
session_store.rb da
Rails.application.config.session_store :cookie_store, key: '_session-test_session'
a
Rails.application.config.session_store :cache_store
funziona!
Qualche idea?
La libreria in questione è la gemma shopify_app utilizzata da molti sviluppatori. Sono d'accordo che è una cattiva idea conservare l'oggetto nella sessione di Rails per una serie di motivi, ma questo è ciò che fa questo gioiello: https://github.com/Shopify/shopify_app/blob/master/lib/generators/shopify_app/templates /app/controllers/sessions_controller.rb#L12-L13 Quello che mi chiedo è il motivo per cui questo è borked in Rails 4.1? Non vedo che accada nella loro app di esempio che è 3.2: https://github.com/Shopify/embedded-app-example –