Rails 应用程序中多个请求之间的会话变量

问题描述 投票:0回答:2

我在我的 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
ruby-on-rails ruby session fork metaprogramming
2个回答
1
投票

当您使用

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
),然后仅使用复制的变量,会话变量将在下一个请求中可用。


0
投票

老实说我不知道你的代码应该是什么 但假设您使用的是 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

root_path 模板中的某处

%h1=session[:payment_token]

这应该有效

© www.soinside.com 2019 - 2024. All rights reserved.