2009-08-13 4 views
5

Mam app szyn, który ma następującą zawartość w config/inicjalizatory/plik session_store.rb:Jak warunkowo przypisać ActionController :: Base.session w szynach 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 

Więc podczas normalnej pracy widzimy obiekty ActiveRecord utworzone w bazie danych dla każdej sesji. Problem polega na tym, że nie zawsze chcemy tworzyć sesje dla żądań - chcielibyśmy móc wyłączyć tworzenie sesji dla automatycznych żądań. W bazie danych znajduje się tysiące rekordów sesji, po jednym dla każdego automatycznego żądania. Przed szyn 2.3.3 dodaje się udało:

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

ale teraz w szynach 2.3.3 „session: off” została zaniechana, ponieważ sesje są teraz leniwi załadowany - jeśli nie z nich korzystać, nie są tworzone. Problem wydaje się, że obiekt sesji jest zawsze przypisywany w pliku sessionstore.rb, a zatem zawsze tworzony. Jeśli usuniemy blok przypisania sesji z pliku konfiguracyjnego, wtedy żadne rekordy sesji nie pojawią się po automatycznym żądaniu. Moje pytanie brzmi: jak przenieść przypisania konfiguracji do skrótu sesji z session_store.rb i do klasy ApplicationController (lub gdzie indziej), gdzie sesja może być warunkowo przypisana tylko wtedy, gdy żądanie nie jest zautomatyzowane? Obawiam się, że dane konfiguracyjne sesji mogą być potrzebne przed uruchomieniem procedury obsługi kontrolera. Gdzie powinienem umieścić przypisanie wartości klucza sesji?

Z góry dziękuję za pomoc.

+0

z odsetkami, czy istnieje powód, dla którego nie używasz domyślnego cookies w oparciu realizacja sesji? – jonnii

Odpowiedz

1

Konfiguracja/inicjalizatory są konfiguracjami jednorazowymi, zwykle są uruchamiane tylko raz podczas uruchamiania. Zgodnie z dokumentacją, leniwy ładunek inicjuje sesję tylko wtedy, gdy obiekt "sesyjny" zostanie dotknięty podczas żądania.

Czy jesteś pewien, że w ogóle nie dotykasz zmiennej sesji w cyklu żądania? (To znaczy, w filtrach, akcjach, pomocnikach lub szablonach). Czy obiekty sesji mają jakąś treść, która mogłaby wskazać, gdzie zostały utworzone?

0

Przepraszam za "spóźnioną" odpowiedź, ale myślę, że jest to istotne dla osób, które lądują tutaj. borykał się z podobnymi problemami odkąd session :off został usunięty z Rails.

postanawiam „back-port” go Rails 2.3+ jako plugin https://github.com/kares/session_off

+0

Próbowałem twojego "tylnego portu" z Devisem i to nie działa. Jakiś pomysł, dlaczego? – refaelos

+0

najprawdopodobniej powodują, że większość wtyczek railsowych zakłada, że ​​'controller.session' nie będzie nigdy' nil', więc jeśli masz zewnętrzny kod używający 'sesji' prawdopodobnie nie będziesz mógł użyć session_off bez dodatkowych" poprawek ".. przepraszam – kares

Powiązane problemy