2009-08-13 4 views
5

Ho un app rotaie che ha il seguente contenuto nella cartella config/inizializzatori/file di session_store.rb:Come assegnare condizionalmente ActionController :: Base.session in rotaie 2.3.3

ActionController::Base.session = { 
    :key   => '_app_session', 
    :secret  => 'a really long string here', 
    :expire_after => 2.minutes 
} 

ActionController::Base.session_store = :active_record_store 

Così durante le normali operazioni stiamo vedendo oggetti ActiveRecord creati nel database per ogni sessione. Il problema è che non sempre vogliamo creare una sessione per le richieste: vorremmo essere in grado di disattivare la creazione di sessioni per richieste automatizzate. Stiamo visualizzando migliaia di record di sessione nel database, uno per ogni richiesta automatica. Prima di rotaie 2.3.3, il seguente è stato possibile:

class ApplicationController < ActionController::Base 
    session :off 
    ... 
end 

ma ora in rotaie 2.3.3 "sessione: off" è stato deprecato, perché le sessioni sono ora pigro-caricato - se non vengono utilizzati, non sono creati Il problema sembra essere che l'oggetto di sessione è sempre assegnato nel file sessionstore.rb, e quindi sempre creato. Se rimuovo il blocco di assegnazione sessione dal file di configurazione, non viene visualizzato alcun record di sessione dopo una richiesta automatica. La mia domanda è, come posso spostare le assegnazioni di configurazione all'hash della sessione da session_store.rb e nella classe ApplicationController (o altrove) in cui la sessione può essere assegnata in modo condizionale solo se una richiesta non è automatizzata? Sono preoccupato che i dati di configurazione della sessione possano essere necessari prima che venga eseguito il gestore del controller. Dove dovrei inserire l'assegnazione dei valori delle chiavi di sessione?

Grazie in anticipo per qualsiasi aiuto.

+0

per interesse, c'è una ragione non si sta usando il cookie predefinito basato implementazione sessione? – jonnii

risposta

1

I config/gli inizializzatori sono configurazioni una tantum, di solito vengono eseguite una volta sola all'avvio. In base alla documentazione, il caricamento lento inizializzerà la sessione solo se l'oggetto "sessione" viene toccato durante una richiesta.

Sei sicuro di non toccare affatto la variabile di sessione nel ciclo di richiesta? (Cioè, nei filtri, azioni, aiutanti o modelli). Inoltre, gli oggetti di sessione contengono alcuni contenuti che potrebbero suggerire dove sono stati creati?

0

scusa per la risposta "in ritardo", ma penso che sia rilevante per le persone che atterrano qui. era alle prese con problemi simili da quando session :off è stato rimosso da Rails.

decido di "back-port" per Rails 2.3+ come plugin https://github.com/kares/session_off

+0

ho provato il tuo "back-port" con Devise e non funziona. qualche idea del perché? – refaelos

+0

molto probabilmente causa la maggior parte dei plugin di rotaie in questi giorni presumiamo che 'controller.session' non sarà mai' nil' mai, quindi se si ha codice esterno usando 'session' probabilmente non si può usare session_off senza ulteriori" tweaks ".. . scusa – kares