Ruby on Rails では、Web リクエスト間でどのようなデータが保持されますか? 質問する

Ruby on Rails では、Web リクエスト間でどのようなデータが保持されますか? 質問する

私はシングルトンビューヘルパークラスを作成する際にデザインパターンを検討しました。これで考えさせられました。シングルトンは実例リクエストを超えて生き残るには?これは別の疑問を生みました。どの変数(もしあれば)がWebリクエスト間で存続するかそれはデプロイメントに応じて変わりますか? (Fastcgi、Mongrel、Passenger、...)

コントローラーのインスタンス変数は永続化されないことは知っています。定数は永続化される (または再ロードされる?) ことは知っています。しかし、クラス変数、クラスのインスタンス変数、Eigenclasses などについては知りません。

ベストアンサー1

簡単な答えは「なし」です。各リクエストは独立したイベントとして扱われ、ユーザー セッションや外部データベース、キャッシュ、ファイル ストアに保存されているもの以外の状態情報は引き継がれません。これを念頭に置いてアプリケーションを設計し、設定したからといってそれが維持されると期待しないことが最善です。

より複雑な話は、いくつかのものは永続するということです。たとえば、コントローラにクラス変数を作成すると、予想どおり、これは 1 つのリクエストから次のリクエストに引き継がれます。問題は、これがそのプロセス内に含まれるコントローラの単一のインスタンスにのみ適用され、他のプロセスによって処理されるリクエストには適用されないことです。キャッシュが必要な場合は、Rails.cache インフラストラクチャを使用し、独自のハッキングは避けてください。

一般的な本番環境は複雑で常に変化しており、プロセスが絶えず作成および破棄され、最終的にどのプロセスが特定のリクエストを処理するかを事前に判断する方法はありません。多くのデプロイメントでは、単一のマシン上の複数のプロセスだけでなく、複数のマシンが関係するため、アプリケーション全体のシングルトン オブジェクトを作成する実用的な方法は実際にはありません。

最も良い方法は、キャッシュ エンジンの上にレイヤーを構築し、シングルトン オブジェクトをキャッシュから取得して書き込む関数のラッパーにすることです。これにより、プロセス間の一貫性を維持しながら、シングルトン オブジェクトの外観を実現できます。

おすすめ記事