2013-03-11 16 views
26

私はRails-APIアプリケーションを持っています。多かれ少なかれ「すぐに使える」が、クッキーベースのセッションストアを追加したい。ここで私がやったことです:CookieセッションストアをRails APIアプリケーションに戻す

アプリ/コントローラ/ application_controller.rb

+ include ::ActionController::Cookies 

のconfig/application.rb

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

作成した設定/初期化子/ secret_token.rb

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

created config/initializers/session_store.rb

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

Iはコントローラでセッションを検査するとき、それは結果:

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

データが書き込まれ、使用されているように見えないが。

しかし、私のブラウザでクッキー自体は

代わりに「_namespace_key」の「_session_id」と命名されている私は、クッキーベースのセッションストレージのために必要なすべての部分を再び追加と思ったが、私は何か他のものが欠けているように見えます。何か案は?

+0

私も同じ問題を抱えています。最後に 'api_only'を無効にしましたか? – Zennichimaro

答えて

12

あなたのapplication.rbファイルからこれらのミドルウェアの宣言を削除し、これを追加する必要があります。

config.api_only = false 

(あなたが持っている)あなたの初期化子で構成されたsession_storeどこかがある場合、これはセッション管理にあなたが望むようにできるようになります。これは明確に文書化されていません、but that's what you're supposed to do

here。あなたは完全なRailsはスタックを使用していないので、

+10

これは問題を解決するかもしれませんが、実際には意味をなさないのです。私はスタックをスリムに保つためにrails-apiを使います。 'config.api_only = false'を設定することは本質的に、正規の完全なRailsスタックを使うことだけです。 ...その場合、rails-apiの使用には何の意味もありません。 – turboladen

+2

@ turboladenが正しい - これはrails-apiの使用目的を打ち破っている。特定のミドルウェアだけを含める場合は、それを行うための非常にクリーンな方法があります。これはrails-api自体が行うことです(https://github.com/rails-api/rails- api/blob/v0.4.0/lib/rails-api/application/default_rails_four_middleware_stack.rb#L13) –

+1

うわー!この質問と回答のために主人を称賛してください!数時間のコードを追跡した後、私は#$%^!私のsession_optionsを使用していませんでした! ;)人々が 'api_only'を無効にしたくない場合に備えて、この回答に代替のオプションを追加します。 – mltsy

6

この行は無視されます。

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

だからではなく、あなたのセッションは、デフォルトのセッションキーset hereを使用しています。ただし、交換することにより、直接これらの引数を渡すことができます:

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

をして:

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

(一部はRailsの内のモジュールによって上書きされるかもしれないので、そのデフォルトの大まかなアイデアを)ここでa full list of options you can passです。

26

あなたがRailsの5にしている、とconfig.api_only = trueを保持したい場合は、セッション層を追加するためのミドルウェアを拡張することができ、config/application.rb

class Application < Rails::Application
config.middleware.use ActionDispatch::Cookies 
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key' 

をこのコードを追加したいとき、これは便利になる可能性がありapi-onlyのアプリを有効にして、ActiveAdminやRails_Adminなどの管理パネルでユーザーセッションを管理する必要があります。

+1

Rails 5でActiveAdminを有効にするにはAPIアプリを使用するには、上記のほかにいくつかの手順を実行する必要があります。具体的には、 'ActionController :: Base'を継承するActiveAdminと' ActionController :: API'を継承するAPIコントローラの2つのベースコントローラを作成する必要があります。また、ダッシュボードビューをレンダリングするためには、さらにいくつかのミドルウェアが必要です。私はすべてのステップで[ガイド](http://www.carlosramireziii.com/how-to-add-active-admin-to-a-rails-5-api-application.html?utm_source=stackoverflow)を書きました。希望が助けてくれる! –

+0

明らかかもしれませんが、この場合は 'config.session_store'はもはや役に立ちません。今はこの 'config.middleware.use'だけが必要です。さらに、 'key: '_namespace_key''のようなオプションも' config.middleware.use'ステートメントに移動する必要があります。 –

+0

この[Railsの問題](https://github.com/rails/rails/issues/24239#issuecomment-199409912)によると、 'AbstractController :: Helpers'と' include ActionController :: Cookies'を含む必要があるかもしれません。ミドルウェアを有効にすること以外はコントローラ内にあります。 – Epigene