【问题标题】:Session hash in rails turning into a stringrails中的会话哈希变成字符串
【发布时间】:2014-08-12 22:19:36
【问题描述】:

由于某种原因,在我的网站上使用了一段时间后,我的会话哈希变成了一个字符串

undefined method `admin?' for "#<Visitor:0x000001071b7800>":String

是我在 render_layout 方法中得到的结果

def render_layout
  if session[:visitor].admin?
    render layout: 'admin'
  else
    render layout: 'application'
  end
end

另外两次我调用或使用 session[:visitor] 是在我的 authenticate 方法和我用来跳过 authenticatelogged_in? 方法中

def authenticate
  uuid = params[:uuid]
  @visitor ||= uuid && Visitor.find_by_uuid(uuid)
  if !@visitor
    authenticate_or_request_with_http_basic do |login, password|
      @visitor = Visitor.find_by_uuid(ENV['ADMIN_UUID']) if login == 'test' &&  password == 'testpw'
    end
    session[:visitor] = @visitor
  else
    session[:visitor] = @visitor
  end
end

def logged_in?
  !!session[:visitor]
end

为什么会变成字符串?我在 atom 中使用了项目搜索,但我只在那些地方调用过它。

编辑:

我在我调用 session[:visitor] 的 4 个位置添加了一个binding.pry,它在所有内容中都第一次起作用。当我第一次关注一个 url 并且

before_action :authenticate, unless: :logged_in?

第二次调用session[:visitor] 变成一个字符串

#=> "#<Visitor:0x00000106851bd0>"

【问题讨论】:

    标签: ruby-on-rails session authentication


    【解决方案1】:

    来自文档,http://guides.rubyonrails.org/security.html#sessions

    不要在会话中存储大型对象。相反,您应该存储它们 在数据库中并将他们的 id 保存在会话中。这将消除 同步头痛,它不会填满你的会话存储 空间(取决于您选择的会话存储,见下文)。这 如果您修改对象的结构并且 它的旧版本仍在某些用户的 cookie 中。与服务器端 会话存储,您可以清除会话,但使用客户端 存储,这很难缓解。

    在会话中存储您的访问者 ID

    session[:visitor_id] = @visitor.id
    

    然后根据需要检索它

    @visitor = User.find_by_id(session[:visitor_id])
    

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 2017-06-02
      • 2015-11-27
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多