2013-03-11 13 views
26

Mam aplikację Rails-API. Mniej lub więcej "po wyjęciu z pudełka", ale chcę dodać z powrotem magazyn sesji oparty na plikach cookie. Oto co zrobiłem:Dodawanie przechowywania sesji plików cookie do aplikacji Rails API

app/controllers/application_controller.rb

+ include ::ActionController::Cookies 

config/environment.rb

+ config.middleware.insert_after ActiveRecord::QueryCache, ActionDispatch::Cookies 
+ config.middleware.insert_after ActionDispatch::Cookies, ActionDispatch::Session::CookieStore 

stworzony config/inicjalizatory/secret_token.rb

+ Namespace::Application.config.secret_token = 'token' 

utworzona konfiguracja/inicjalizacje/session_store.rb

+ Namespace::Application.config.session_store :cookie_store, :key => '_namespace_key' 

Kiedy sprawdzać sesję w kontrolerze wynika:

<Rack::Session::Abstract::SessionHash:0x3fdadc5daa24 not yet loaded> 

Jednak wydaje się, że dane są zapisywane i używane.

Ale w mojej przeglądarce sam plik cookie jest nazwany jako „_session_id” zamiast „_namespace_key”

myślałem dodałam z powrotem każdy kawałek wymaganej dla plików cookie oparte przechowywania sesji, ale wydaje się, że brakuje czegoś innego . Jakieś pomysły?

+0

Mam również ten sam problem, czy w końcu wyłączyłeś 'api_only'? wydaje się, że to nie jest dobre rozwiązanie .. – Zennichimaro

Odpowiedz

12

Musisz usunąć te deklaracje pośredniej z pliku application.rb i dodać to:

config.api_only = false 

ten umożliwi zarządzanie sesją, jak chcesz, jeśli nie jest skonfigurowany session_store gdzieś w incjalizatory (co masz) . To nie jest wyraźnie udokumentowane, but that's what you're supposed to do.

Przykład .

+10

Chociaż może to rozwiązać problem, to naprawdę nie ma sensu robić. Używam rails-api, aby utrzymać cienki stos i przyciąć. Ustawienie 'config.api_only = false' zasadniczo oznacza użycie zwykłego, pełnego stosu Railsów. ... w takim przypadku nie ma sensu używanie szyn-api. – turboladen

+2

@turboladen ma rację - to pokonuje cel używania szyn-api. Jeśli chcesz tylko uwzględnić określone oprogramowanie pośrednie, z określonymi opcjami, jest to bardzo czysty sposób - w ten sam sposób rails-api sam to robi (tutaj) (https://github.com/rails-api/rails- api/blob/v0.4.0/lib/rails-api/application/default_rails_four_middleware_stack.rb # L13) –

+1

Holy crap! Chwalcie Pana za to pytanie i odpowiedź! Po kilku godzinach śledzenia kodu, byłem już prawie gotowy do uduszenia się, próbując dowiedzieć się, dlaczego # $% ^! nie korzystałem z moich opcji session_s! ;) Zamierzam dodać alternatywną opcję do tej odpowiedzi na wypadek, gdyby ludzie nie chcieli wyłączyć 'api_only'. – mltsy

6

Linia ta jest ignorowana, ponieważ nie używasz pełnych Rails stosu:

::Rails.application.config.session_store :cookie_store, 
    :key => '_namespace_key' 

Więc zamiast, sesja jest przy użyciu domyślnego klucza sesji set here. Można jednak przekazać te argumenty bezpośrednio zastępując:

config.middleware.insert_after 
    ActionDispatch::Cookies, ActionDispatch::Session::CookieStore 

z:

config.middleware.insert_after 
    ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, 
    :key => '_namespace_key' 

Oto a full list of options you can pass (z grubsza ich wartości domyślnych, ponieważ niektóre z nich mogą być zastąpione przez moduły w Rails).

26

Jeśli jesteś na szynach 5, a chcesz zachować config.api_only = true można przedłużyć middleware dodawania warstwy sesji dodając ten kod po class Application < Rails::Application w config/application.rb

config.middleware.use ActionDispatch::Cookies 
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key' 

To może się przydać, gdy chcesz mieć włączoną aplikację obsługującą szyny, ale muszą zarządzać sesjami użytkowników za pomocą panelu administracyjnego, takiego jak ActiveAdmin lub Rails_Admin.

+1

Aby włączyć ActiveAdmin na Railsach 5 W aplikacji API musisz wykonać kilka innych czynności oprócz powyższych. W szczególności musisz utworzyć 2 kontrolery podstawowe, jeden dla ActiveAdmin, który dziedziczy po 'ActionController :: Base', a drugi dla kontrolerów API, które dziedziczą po' ActionController :: API'. Potrzebne są jeszcze kilka elementów oprogramowania pośredniego, aby renderować widoki pulpitu nawigacyjnego. Napisałem [przewodnik] (http://www.carlosramireziii.com/how-to-add-active-admin-to-a-rails-5-api-application.html?utm_source=stackoverflow) wszystkimi krokami. Mam nadzieję, że pomaga! –

+0

Może to być oczywiste, ale "config.session_store" nie jest już w tym przypadku przydatne; tylko ten plik 'config.middleware.use' jest teraz wymagany. Ponadto opcje takie jak 'klucz: '_namespace_key'' również powinny zostać przeniesione do instrukcji' config.middleware.use'. –

+0

Zgodnie z tym [problemem Railsów] (https://github.com/rails/rails/issues/24239#issuecomment-199409912) może być również konieczne użycie opcji "include AbstractController :: Helpers" i "include ActionController :: Cookies" w sterowniku oprócz włączenia oprogramowania pośredniego. – Epigene

Powiązane problemy