【问题标题】:Ruby on Rails: Session Data ErrorRuby on Rails:会话数据错误
【发布时间】:2011-07-24 23:10:15
【问题描述】:

我对 Rails 很陌生。我有一个登录系统,如果输入的数据有效,则设置session[:user]。但是,当稍后在ApplicationController 中引用session[:user] 时,无论上下文如何,它总是会给我一个错误,除非该行被注释掉。示例:

user = session[:user]

它给我的错误是一个通用的“此时不工作”错误,它实际上并没有说明问题所在。

编辑:这是错误。这是一个通用的。

We're sorry, but something went wrong.

We've been notified about this issue and we'll take a look at it shortly.

我还尝试了许多不同的变体,无论我在那里存储什么,它似乎仍然给我错误。这是我的代码:

登录处理:

session[:name] = valid_user.name
session[:password] = valid_user.password

会话验证(在每个页面视图上):

name = session[:name]
pass = session[:password]

【问题讨论】:

  • 这听起来像是一个奇怪的错误。你能粘贴确切的错误吗?此外,还有一些关于如何指定会话的代码。确保不要在会话中存储整个模型。只需存储 id。
  • 我没有看到错误。当您删除 name =session[:name] 时,您不会收到相同的错误吗?这种错误大多数时候表示重定向错误。
  • 当我将 session[:name] 和 session[:password] 都替换为 "" 或注释掉检查会话数据的函数调用时,我没有收到错误消息。否则,我在每个页面上都会收到错误消息。

标签: ruby-on-rails ruby session


【解决方案1】:

好的,有几件事:

  1. 您需要让您的应用退出生产模式 - 这就是您收到此无用错误消息的原因。设置为开发模式或阅读您的服务器日志,您应该会收到更详细和有用的错误消息。 (相关讨论见this question,只需将其设置为开发,而不是像提问者那样将其设置为生产)

  2. 不要将用户对象存储在会话中,并且绝对不要将密码存储在会话中。您应该只存储用户 ID,然后执行以下操作:

    user = User.find_by_id(session[:user_id]
    
  3. 在您分享更详细的错误消息后,我可以尝试为您提供更多帮助,但最有可能的错误是您要求一些未定义的会话参数。详细的错误消息会告诉您什么和在哪里,但同时请仔细检查以确保您从未在尚未设置会话值时询问它。

【讨论】:

  • 1:它处于开发模式。我的大部分错误都是冗长的。服务器日志在哪里? 2. 我不认为我将整个对象存储在会话中,如果我不将密码存储在会话中,那么用户不能欺骗登录吗?不知道这是否是 Rails 中的一个问题,但它是我更熟悉的其他语言。 3.如何检查会话变量是否定义/未定义而不会导致出现这样的错误?
  • 嗯,我找到了日志。看起来像一个零对象错误。 “当你没想到时,你有一个 nil 对象!”
  • 嗯,原来我可以在视图中访问会话变量,但不能在 ApplicationController 中访问。有什么理由我不能在那里访问它吗?
  • RE:开发模式——很好。这真的很奇怪,它只是给你通用的 500 屏幕,但无论如何。 RE:欺骗登录 - 身份验证的重点是您不要在未通过身份验证的情况下设置该用户 ID。 RE:Nil 对象——这证实了我所说的,你在某个不存在的地方请求一个会话变量。现在,我认为您可以从应用程序控制器访问会话,但我需要查找它,因为我从来不需要。
  • 另外两个提示,因为我认为我无法为您找到此错误:首先,请查看 Devise - 请参阅 railscasts.com/episodes/209-introducing-devise 了解介绍。它可能比您尝试烘烤的更容易使用。其次,去购买Beginning Rails 3 (amazon.com/Beginning-Rails-Experts-Voice-Development/dp/…)。只需要一个周末就能通读一遍,它非常有用,而且就像将扭曲速度应用到您的 Rails 学习曲线中一样。物有所值 - 我是如何开始的,所以我真的知道它有效。
【解决方案2】:

嗯,我没有看到你在任何地方初始化 session[:name]。您正在使用 session[:user] 来做到这一点。真的是这样吗?

我认为如果你使用:

name = session[:user]

它会起作用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2014-04-17
    • 2012-12-05
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多