会话哈希在rails中转换为字符串

时间:2014-06-22 22:31:38

标签: ruby-on-rails session authentication

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

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

我打电话或使用会话[:visitor]的唯一两次是我的authenticate方法,我用logged_in?方法跳过authenticate

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

为什么这会变成一个字符串?我在原子中使用了一个项目搜索,我只是在那些地方调用它。

编辑:

我在我调用会话[:visitor]的4个位置添加了binding.pry,并且它第一次通过所有内容工作。我第一次关注网址

before_action :authenticate, unless: :logged_in?

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

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

1 个答案:

答案 0 :(得分:1)

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

  

不要在会话中存储大对象。相反,你应该存储它们   在数据库中并将其ID保存在会话中。这将消除   同步头痛,它不会填满你的会话存储   空间(取决于您选择的会话存储,请参阅下文)。这个   如果你修改一个对象的结构,那也是个好主意   它的旧版本仍然存在于某些用户的cookie中。与服务器端   会话存储您可以清除会话,但与客户端   存储,这很难缓解。

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

session[:visitor_id] = @visitor.id

然后根据需要检索

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