Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在应用程序控制器中创建当前的用户助手方法时,为什么不在会话中保存整个用户对象?_Ruby On Rails_Ruby_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 在应用程序控制器中创建当前的用户助手方法时,为什么不在会话中保存整个用户对象?

Ruby on rails 在应用程序控制器中创建当前的用户助手方法时,为什么不在会话中保存整个用户对象?,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,我理解如何在应用程序控制器中简单地实现当前的用户方法。通常我们是这样做的 helper_method :current_user def current_user @current_user ||= User.find_by_id(session[:user_id]) if session[:user_id].present? end 但我注意到,如果我们有session[:user_id],它会在每次请求时对DB产生影响。因此,与其在会话[:user_id]中保存user.id,不如在会

我理解如何在应用程序控制器中简单地实现当前的用户方法。通常我们是这样做的

helper_method :current_user
def current_user
  @current_user ||= User.find_by_id(session[:user_id]) if session[:user_id].present?
end
但我注意到,如果我们有session[:user_id],它会在每次请求时对DB产生影响。因此,与其在会话[:user_id]中保存user.id,不如在会话[:user]中保存整个用户对象,并执行如下操作

def current_user
  session[:user]
end

这种方法的障碍是什么?至少这不会在每次请求时命中DB,并将用户数据保留在会话中。

将对象保存到会话中不是一个好主意。在将数据存储到会话中时,必须考虑很少的事情,如

  • 数据有多大
  • 对象可以随时更改,若将对象存储到会话中,该会话用户将不会影响更改

用户浏览器中作为cookie的会话存储和cookie意味着严格的4kB大小限制。这很好,因为您无论如何都不应该在会话中存储大量数据,在会话中存储当前用户的数据库id通常是可以的,但不建议存储用户的对象。

这可能是完全合理的。