【问题标题】:Rails: How can you access session variables using multiple controllers?Rails:如何使用多个控制器访问会话变量?
【发布时间】:2009-07-12 11:48:28
【问题描述】:

我在使用会话变量时遇到问题。我有两个名为“graduate_students_controller”和“current_students_controller”的控制器。这些控制器中的每一个都控制不同的视图文件。我在这两个控制器中都使用会话变量来存储会话信息。

这就是问题所在。假设我有两个视图文件“reports/current_students_list”、“reports/graduate_students_list”,每个文件都由上述控制器单独控制。

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

所以在我看来,第一个加载的网络应用程序的会话变量。被第二个加载的网络应用程序覆盖。可能是因为第二个页面比第一个页面存储了一个新的 cookie?

我该如何解决这个问题?

非常感谢任何建议。

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

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

【问题讨论】:

  • 您使用的是哪个版本的 Rails?另外,这些控制器是在同一个 Rails 应用程序中,还是在不同的应用程序中?
  • 嗨,John,我使用的 rails 版本是 2.2.2。我在 environment.rb 中指定的 gems 版本如下: ----------- # 指定当 vendor/rails 不存在时要使用的 Rails 的 gem 版本 RAILS_GEM_VERSION = '1.2.3' 除非定义? RAILS_GEM_VERSION --------------- (目前我没有在我的本地机器上使用任何新版本,因为这些是我们生产服务器上的当前设置。我想根据测试我的应用程序给他们)是的,这些控制器和视图文件属于同一个 Rails 应用程序。那么知道是什么导致了这个问题吗?谢谢约翰
  • 为了清楚起见,这两个控制器正在访问的会话变量没有共同的名称。所以没有理由覆盖会话变量,除非第二次加载的网页在现有的(第一次加载的页面已经存储的)上存储了一个新的 cookie?这是我能想到的唯一合乎逻辑的原因。但是你怎么能解决这样的事情呢?有人遇到过类似的情况吗?

标签: ruby-on-rails ruby controller session-variables


【解决方案1】:

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

config.action_controller.session = { :key => "_myapp_session", :secret => "..." }

如果您在同一个应用程序中使用来自两个不同控制器的相同会话变量,那么您需要编写代码来适应这种情况,但我不建议这样做。访问会话数据时,检查 nil 值:

session[:some_key].nil?

并确保公共代码(即在 application_controller.rb 中)不会覆盖您的值。

【讨论】:

  • 嗨,马特,我指的是同一个应用程序中的两个控制器。当您说“相同的会话变量”时,您指的是两个控制器使用的相同会话变量名称吗?不,我没有这样做,两个控制器为其会话变量使用不同的名称。我查看了我的 application.rb,果然我发现了这个: session :session_key => '_StudDab_session_id' 所以我想这就是问题所在?每次我加载新页面时,当前会话都会被覆盖?我可以通过在两个控制器中指定唯一的会话密钥来解决这个问题吗?
  • 否 - 每个应用程序的会话密钥必须是唯一的,而不是同一应用程序中的控制器。我认为您的应用程序中某处存在一个错误,该错误正在清除会话中的值。我建议在控制器操作的顶部记录会话变量的值,然后在最后再次记录它们。看看他们是否改变,并从那里追溯。
  • 嗨,马特更改会话密钥确实解决了问题。我将尝试调查并找出导致它的原因。这是一个非常令人沮丧的问题。感谢您的建议,马特。
  • 当我在每个控制器的末尾插入“p session:session_key”时,我得到:.. [{:session_key => "_my_session_id"}, {:disabled => true}, {:disabled => true}].. 这意味着什么吗?我是红宝石新手。当我将“p session :session_key”放在开头时,我得到了相同的输出,但只有一个“{:disabled => true}”而不是两个。
  • 嗨,是的,我发现当第一次加载每个页面时,每个控制器中都会调用 reset_session。你是对的。我更改了它,因此控制器将仅重置它已声明的变量,而不是在调用它时重置整个集合。非常感谢您帮助我解决问题。
猜你喜欢
  • 2011-08-07
  • 2013-05-28
  • 2014-11-14
  • 2011-12-13
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多