Początki z RoR i brak zgodności z książką Agile web development

Witam, kilka dni temu rozpocząłem swoją naukę railsów. W jednym z tematów znalazłem informacje od jakich pozycji powinienem zacząć i tak jak polecaliście zacząłem od Agile Web Development with Rails (edycja trzecia). Jak do tej pory wszystko szło mi bardzo pomyślnie i jestem pozytywnie zaskoczony prostotą railsów. Natomiast napotkałem problem na stronach 107-108 (zapisywanie sesji w bazie danych). Mam teraz pytanie. W książce mam w pliku environment.rb który znajduje się w katalogu config usunąć komentarz z linii :

config.action_controller.session_store = :active_record_store

Jednak u mnie w tym pliku nie ma takiej linii ;| odnalazłem jednak w pliku session_store.rb w katalogu config/initializers linię:

#ActionController::Base.session_store = :active_record_store

która jest okomentowana tak samo jak ta podana w książce więc przypuszczam, że to o nią właśnie chodzi.
Dalej jednak mam w pliku app/controllers/application.rb odkomentować linię"

#session :session_key => ‘_depot_session_id’

oraz dodać linię:

protect_from_forgery :secret => ‘8c3e099237e6366fd2f5366e9c430e79’

natomiast u mnie znowu nie ma tej pierwszej linii a plik nazywa się application_controller.rb (ale to chyba nie ma znaczenia)
natomiast w pliku config/initializers/session_store.rb znajduje się taki kod

ActionController::Base.session = {
:key => ‘_depot_session’,
:secret => ‘b7940307c0648f465ad3c915ebfca6e1f28de8ddb94db1f683cd1caad3b35e62a042179827084ad618ee72a65cb5d86d32dfcb91c15eb4ac8393c5b75021fd8f’
}

i teraz się zastanawiam gdzie co dodać żeby to działało, domyślam się iż problem polega na tym, że pracuję na nowszej wersji railsów i niektóre elementy uległy zmianie. Czy ktoś mógłby mnie nakierować na poprawne rozwiązanie tego problemu tak bym mógł kontynuować naukę ? :wink:
Z góry dzięki za pomoc.

  1. Najnowsza wersja railsów, czyli? 2.3.8 czy 3.0RC1?
  2. Zajrzyj tu: http://apidock.com/rails/ActiveRecord/SessionStore#478-So-how-do-you-enable-db-sessions-
  3. Dlaczego chcesz użyć sesji zapisywanej w bazie? Rozumiesz konsekwencje związaną z koniecznością czyszczenia takiej tabeli? Domyślnie sesja trzymana jest w ciasteczku - do przechowywania ID/maila użytkownika czy innych dupereli powinno to w zupełności wystarczyć, a nie ma problemu z expirowaniem tych danych.

Używam railsów 2.3.8, nie wiem jeszcze jak przechowywać sesję w ciasteczkach, chciałem postępować tak jak jest w książce jednak występują te małe rozbieżności przez co trochę się pogubiłem.

Przechowywanie sesji w ciasteczku jest ustawione domyślnie, więc nie musisz nic zmieniać, żeby działało.

Co do różnic między ciasteczkiem, a bazą danych, to w bardzo dużym skrócie:

  • sesje w bazie danych są wolniejsze
  • sesje w cookies teoretycznie można podejrzeć dlatego nie należy tam trzymać jakichś ważnych danych, np. numerów kart kredytowych :wink: (aczkolwiek nie da się ich zmienić, więc admin=true można bez problemu).

Na razie proponuję zostać przy cookies, nie ma po co się męczyć :wink: Co oznacza: nie musisz nic zmieniać.

protect_against_forgery możesz wstawić w application_controller - to jest ochrona przed atakami CSRF, użyj googla jak chcesz więdzieć coś więcej na ten temat. Tylko nie musisz dodawać :secret, samo protect_against_forgery wystarczy.

Co do reszty rozbieżności, to tak jak zauważyłeś ustawienia poleciały do initialziers, możesz zostawić je tak jak obecnie wyglądają, z jednym wyjątkiem, zmień :secret, który jest ustawiony w sesji (na inny losowy ciąg znaków o podobnej długości). Znając go ktoś ma pełny dostęp do Twoich sesji w ciasteczkach.

co do sesji, rozumiem że zalecane jest trzymanie ich w ciasteczku jeśli nie zawierają danych typu np karty kredytowej itp ?

Są to ustawienia domyślne, ale nie wiem czy zalecane :wink: Wszystko zależy od potrzeb. Jest to na pewno metoda wydajniejsza i prostsza do konfiguracji (nie wymaga active recordu), ale masz też mniejszą kontrolę nad sesjami. Nie możesz np. w każdej chwili wyczyścić sesji.

pewnie gdyby zmienić ActionController::Base.cookie_verifier_secret sesje przechowywane w cookies u użytkowników stały by się nieważne ? Ale to chyba doszło dopiero w Railsach 3.0

Właściwie to racja, wystarczy zmienić :key, czyli moje poprzedniego można zignorować, nie przemyślalem tego :slight_smile: