私は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) にディープコピーし、その後はコピーした変数のみを使用することです。そうすれば、セッション変数は次のリクエストで使用できるようになります。