abstract:
1. 生成随机字符串,当做记忆令牌;
2. 把这个令牌存入浏览器的 cookie 中,并把过期时间设为未来的某个日期;
3. 在数据库中存储令牌的摘要;
4. 在浏览器的 cookie 中存储加密后的用户 ID;
5. 如果 cookie 中有用户的 ID,就用这个 ID 在数据库中查找用户,并且检查 cookie 中的记忆令牌和数据库中的哈希摘要是否匹配。
title 1
title 3
1. 显示资料页面的链接:
<%= link_to "Profile", current_user %>
这个链接可以写成:
<%= link_to "Profile", user_path(current_user) %>
可以直接链接到用户对象,Rails 会自动把 current_user 转换成 user_path(current_user)。
2. 关于update_attribute存储:remember_digest:
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
remember user
redirect_to user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
先是remember user →调用session_helper.rb里的…
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
user.remember又调用models/user.rb里的…
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
这里的
update_attribute(:remember_digest, ...)
并没有指明是哪个用户model里的:remember_digest更新!
所以我的理解是:
user.remember 里的update_attribute(…)就是user.update_attribute(…)