Ruby on rails Rails:如何使用多个控制器访问会话变量?

Ruby on rails Rails:如何使用多个控制器访问会话变量?,ruby-on-rails,ruby,controller,session-variables,Ruby On Rails,Ruby,Controller,Session Variables,我在使用会话变量时遇到问题。我有两个控制器,分别是“研究生控制器”和“当前学生控制器”。每个控制器控制不同的视图文件。我将会话变量用于这两个控制器来存储会话信息 问题出在这里。假设我有两个视图文件“reports/current_students_list”、“reports/graduate_students_list”,每个文件分别由上述控制器控制 现在,如果我尝试从同一个浏览器中打开这两个网页,并尝试同时使用它们,我会从第一个加载的页面中得到“nil object access”错误。“n

我在使用会话变量时遇到问题。我有两个控制器,分别是“研究生控制器”和“当前学生控制器”。每个控制器控制不同的视图文件。我将会话变量用于这两个控制器来存储会话信息

问题出在这里。假设我有两个视图文件“reports/current_students_list”、“reports/graduate_students_list”,每个文件分别由上述控制器控制

现在,如果我尝试从同一个浏览器中打开这两个网页,并尝试同时使用它们,我会从第一个加载的页面中得到“nil object access”错误。“nil对象”是指第一页应该访问的会话变量。但是,当我单独使用这两个web应用程序中的任何一个时,它们都可以正常工作

所以,在我看来,第一次加载的web应用程序的会话变量。正在被第二个加载的web应用程序覆盖。也许是因为第二个页面在第一个页面上存储了一个新的cookie

我该如何解决这个问题

任何建议都将不胜感激

再澄清一下:这两个控制器属于同一个Rails应用程序。而且我在两个控制器中使用的会话变量名并不相同。所以我不明白为什么它们会被覆盖


我是rails的新手,非常感谢您对这个问题的帮助。谢谢。

我不确定您是否正在运行两个应用程序,或者是指同一应用程序下的两个控制器。如果您正在查看不同的web应用程序,那么我认为您在您的环境中为每个应用程序使用相同的名称和会话密钥。尝试更改环境中的键值。rb:

config.action_controller.session = { :key => "_myapp_session", :secret => "..." }
如果您在同一个应用程序中使用来自两个不同控制器的同一会话变量,那么您需要编写代码来适应这种情况,尽管我不建议这样做。访问会话数据时,请检查零值:

session[:some_key].nil?

并确保公共代码(即在应用程序_controller.rb中)不会覆盖您的值。

您使用的Rails版本是什么?另外,这些控制器是在同一个Rails应用程序中,还是在不同的应用程序中?嗨,John,我使用的是Rails版本is 2.2.2。在my environment.rb中指定的my gems版本如下:---------------指定当供应商/Rails不存在时要使用的Rails的gem版本Rails\u gem\u版本='1.2.3',除非定义?RAILS\u GEM\u VERSION-------------------(我目前没有在本地机器上使用任何更新的版本,因为这些是我们生产服务器上的当前设置。我想根据它们测试我的应用程序)是的,这些控制器和视图文件属于同一个RAILS应用程序。你知道是什么导致了这个问题吗?感谢JohnJust澄清,这两个控制器正在访问的会话变量没有通用名称。因此,没有理由覆盖会话变量,除非第二个加载的网页在现有的cookie上存储了一个新的cookie(第一个加载的网页已经存储了cookie)?这是我能想到的唯一合乎逻辑的理由。但是你怎么能解决这样的问题呢?以前有人遇到过类似的情况吗?嗨,Matt,我指的是同一应用程序中的两个控制器。当您说“相同会话变量”时,您指的是两个控制器使用的相同会话变量名称吗?不,我没有这样做,这两个控制器对其会话变量使用不同的名称。我查看了application.rb,果然找到了这个:session:session\u key=>“\u StudDab\u session\u id”,所以我想这就是问题所在?每次加载新页面时,当前会话都会被覆盖?我可以通过在两个控制器中的每个控制器中指定唯一的会话密钥来解决此问题吗?否-会话密钥需要对每个应用程序是唯一的,而不是同一应用程序中的控制器。我认为你的应用程序中有一个bug,它要么清除了你会话中的值。我建议在控制器操作的顶部记录会话变量的值,然后在最后再次记录它们。看看他们是否改变,并从那里追溯。嗨,马特,改变会话密钥确实解决了问题。我会尽力调查并找出原因。这是一个相当令人沮丧的问题。谢谢你的建议,马特。当我在每个控制器的末尾插入“p会话:会话密钥”时,我得到:。。[{:session\u key=>“\u my\u session\u id”},{:disabled=>true},{:disabled=>true}]。。这有什么意义吗?我对ruby是新手。当我把“p session:session_key”放在开头时,我得到了相同的输出,但只有一个“{:disabled=>true}”,而不是两个。嗨,是的,我发现在每个页面第一次加载时,在每个控制器中都调用了reset_session。你是对的。我改变了这一点,以便控制器在调用时只重置它声明的变量,而不是重置整个集合。非常感谢你帮我解决了这个问题。