リクエストの終了前にセッションをRailsで維持する方法は?
-
27-10-2019 - |
質問
Rails 2.3とActivereCordをセッションストアとして使用しています。必要になる前にセッションの作成を避けたいと思います。
セッションに関連付けられたアイテムを保存するためのITENSテーブルがあります。つまり、そのモデルには関連性があります belongs_to :session
.
新しいアイテムを作成するはずのAJAXコールがあります。まだセッションがない場合は、アイテムに関連付けられるセッションを作成する必要があります。このためには、Cookieによるsesssionを識別するために使用されるSession_idではなく、セッションテーブルからのIDが必要です。ただし、セッションレコードは、リクエストが終了した後にのみDBで作成されます。元:
def create
request.session_options[:id] # nil if there is no session yet
session[:activate] = 1 # this "creates" the sesssion (but not in DB)
request.session_options[:id] # now the new generated session_id
db_session = Session.find_by_session_id(request.session_options[:id]) # nil, not in DB yet :(
Item.new(
:session_id => db_session.id, # ops, id called for nil object
:data => params[:data]
)
end
解決
「モデルオブジェクトはセッションについて何も知らないはずです」 http://markmail.org/message/4ilmpn7s3wkq6iod).
そして、これは理にかなっています。なぜなら、私がメモリ、クッキー、ファイルシステム、またはどこにでもセッションを保存することに決めた場合、モデルコードでは何も変更されないからです。
そのため、解決策は、別のテーブルを作成して項目を保存することです。まだセッションがない場合は、新しい項目_groupを作成し、セッションにIDを保存します。それ以外の場合は、セッションからitems_group_idを取得すると完了です!
セッションがデータベースに保存されている場合は、もう問題ではありません。
所属していません StackOverflow