1

警告: これの一部は非常に間違っている可能性があるため、私の仮定が間違っている場合はお知らせください。

これが私が達成しようとしていることです:

ログインにrestful-authenticationを使用しています。ただし、UI に flex/ruby_amf を使用しているため、flex からの各接続を個別に認証する必要があります。

私がそれを行うことにした方法は、ログイン画面を組み込みのフラッシュ ページにリダイレクトし、セッション ID をフラッシュ変数として挿入することでした。Flash アプリはすべてのリクエストで session-id を送信し、関連するすべてのコントローラーの before フィルターが、session-id で識別されるセッションに関連付けられているユーザーがログオンしているかどうかを確認します。

ユーザーをセッションに関連付ける方法は、「user_id」列をセッション テーブルに追加し、ログイン関数から呼び出される SQL「update sessions set user_id...」タイプのクエリを実行することです。

ただし、user_id はユーザーが 2 回目にログインしたときにのみ更新されます。少し調査したところ、ログイン関数の実行中にセッション テーブルのレコードがまだ存在しないことがわかりました。

したがって、この時点までのすべてが理にかなっていて、ベストプラクティスなどに準拠している場合、私の質問は次のとおりです。

セッション テーブルのレコードはどの時点で作成されますか? ログイン関数でセッション オブジェクトを更新し、レールに user_id をデータベースに書き込む方法はありますか?

Rails でのセッションの動作は、私にとって本当に謎です。助けていただければ幸いです。

ありがとうございました。

4

1 に答える 1

1

Rails 2.3 では、Rack アプリケーションが処理を終了した後にセッションが保存されます。従来の Rails アプリケーションでは、これはリクエストが完全に処理された後 (フィルター、コントローラー アクション、ビュー レンダリングの前、フィルターの後) になります。を見てくださいactionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/session/abstract/id.rb

考えてみれば、これは完全に理にかなっています。セッションに何かを配置するたびにセッションをそのストアに書き込むと、多くの余分なオーバーヘッドが発生します。

これはRailsなので、十分にいじりたい場合は、いつでも好きなときに保存するセッションを作成する方法を自分でモンキーパッチすることができます。お勧めしません。Rails が進化するにつれて、コードを常に書き直さなければならなくなります。

ActiveRecord::SessionStore の場合、1 つの行が 1 つのセッションにマップされます。data列は、セッションに配置したすべてのオブジェクトのエンコード形式です。リクエストが来るたびに、Rails は、以前にセッションに保存したすべてのオブジェクトの新しいインスタンスを作成することによって、セッションを既存のとおりに再構成する必要があります。

于 2009-06-01T18:24:45.667 に答える