由于某种原因,在我的网站上一段时间后,我的会话哈希变成了一个字符串
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>"
答案 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])