我在我的 Rails 应用程序中,正在控制器方法中的子过程中设置会话的值,然后重定向到静态页面,该静态页面最终重定向到我的最终控制器/操作方法。在子过程中设置会话不会给我返回到我登陆的最终控制器操作中的值。我之前使用过 flash,但它也不起作用,所以我决定在我的多个结果中使用 session。有什么想法如何解决这个问题吗?
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
这证明了 fork 中的代码复制了变量,但没有在父级中更改它。即使你重复分叉、添加睡眠等部分,你仍然会得到
1
。
我无法真正修复您的代码,但我试图表明这种方法并不是最佳的。分叉进程对变量的任何更改仅影响其自身,不会传播到主进程。
也许您应该做的是将会话变量深度复制到类变量中(
@sth
),然后仅使用复制的变量,会话变量将在下一个请求中可用。
老实说我不知道你的代码应该是什么 但假设您使用的是 Rails,并保存会话 - 您位于控制器内。
在控制器中使用会话非常简单并且始终有效。
class PaymentController
def success
session[:payment_success] = true
session[:payment_token] = params[:token]
redirect_to enable_features_path, status: 303
end
def enable_features
if session[:payment_success]
current_user.wanted_featurues.find_each(&:enable)
end
redirect_to root_path, status: 302
end
%h1=session[:payment_token]
这应该有效