在应用程序控制器中创建current_user helper_method时,为什么我们不在会话中保存整个User对象?

时间:2017-04-28 05:48:00

标签: ruby-on-rails ruby ruby-on-rails-5

我理解如何在应用程序控制器中简单地实现current_user方法。通常我们做

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造成打击。因此,不要在session [:user_id]中保存user.id,而是为什么我们不在session [:user]中保存整个用户对象,并且这样做。

def current_user
  session[:user]
end

这种方法有什么绊脚石?至少在每次请求时都不会命中DB并将用户数据保存在会话中。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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