Rails アプリ内の複数のリクエスト間のセッション変数

概要

私はRailsアプリを使用しており、コントローラーメソッドの子プロシージャにセッションの値を設定してから静的ページにリダイレクトし、最終的に最終的なコントローラー/アクションメソッドにリダイレクトします。子プロシージャでセッションを設定しても、最終的なコントローラー アクションで値が返されません。以前はフラッシュを使用していましたが、それも機能しなかったので、複数の結果でセッションを使用することにしました。この問題を解決する方法はありますか?

child_proc = Proc.new do
  session['ashish'] = "abbbbsb"
  .......
end

fork do
  sleep 1 #just giving enough time for the request to return

  child_proc.call

  exit #it will only exit the chld proc
end

解決策

fork を使用すると、基本的に、独自の変数を使用して新しい Ruby プロセスを開始することになります。この新しいプロセスは、親プロセスと同じメモリを共有しません。親と通信することもできますが、その方法についてはここでは説明しません。

この例を見てください。

var = 0
child_proc = Proc.new do
  puts 'from proc:  ' + var.to_s
  var += 1
end

child_proc.call
puts 'after call: ' + var.to_s

pid = fork do
  child_proc.call
end
Process.wait(pid)
puts 'after fork: ' + var.to_s

出力は次のとおりです。

from proc:  0   # main process
after call: 1   # main process 
from proc:  1   # forked process
after fork: 1   # main process

これは、フォーク内のコードは変数をコピーしますが、親内の変数は変更しないことを証明しています。フォークする部分を繰り返したり、スリープなどを追加したりしても、1 が得られます。

コードを実際に修正することはできませんが、このアプローチが最適ではないことを示そうとしています。フォークされたプロセスによる変数への変更はそれ自体にのみ影響し、メイン プロセスには反映されません。

おそらく代わりにすべきことは、セッション変数をクラス変数 (@sth) にディープコピーし、その後はコピーした変数のみを使用することです。そうすれば、セッション変数は次のリクエストで使用できるようになります。