Rails教程 – 9.3.3 Current_User
所以我正在关注Rails教程 ,并且我已经使用sign_in SessionHelper进入了我们想要用户签名的部分。
问题1 :
module SessionsHelper def sign_in(user) cookies.permanent.signed[:remember_token] = [user.id, user.salt] current_user = user end def current_user=(user) #set current_user @current_user = user end def current_user #get current_user @current_user end
我遇到困难的部分是:
问题是它完全无法解决我们的问题:使用代码,用户的登录状态将被忘记:用户一进入另一页面。
我不明白这是怎么回事? 我继续阅读并了解添加的代码,确保@current_user永远不会为零。 但是我没有看到如果我们刚刚在第5行建立了current_user将如何恢复为nil。
问题2 :
更新后的代码如下:
module SessionsHelper def sign_in(user) #in helper because used in view & controller cookies.permanent.signed[:remember_token] = [user.id, user.salt] current_user = user end def current_user=(user) #set current_user @current_user = user end def current_user #get current_user @current_user ||= user_from_remember_token #<-- short-circuit evaluation end private def user_from_remember_token User.authenticate_with_salt(*remember_token) #*=use [] instead of 2 vars end def remember_token cookies.signed[:remember_token] || [nil, nil] end end
在remember_token助手中,为什么它使用cookies.signed []而不是cookies.permanent.signed []&为什么它不使用|| =运算符我们刚学到了什么?
问题3 :
为什么我们需要authenticate_with_salt? 如果我validation&sign_in可以看到传递给它的用户的id和salt属性,为什么我们需要double_check它? 什么样的情况会引发混乱?
请记住, @current_user
等实例变量仅在请求期间设置。 控制器和视图处理程序实例专门为一次和一次渲染而创建。
通常很容易假设,因为你已经在某个地方设置了一个变量,它将在未来的某个时刻继续工作,但事实并非如此。 要在请求之间保留某些内容,您需要将其存储在某个位置,最方便的地方是session
工具。
在这个例子中缺少的是:
def current_user @current_user ||= User.find_by_remember_token(cookies[:remember_token]) end
通常,最好使用write访问器来映射您给出的sign_in
方法的function作为示例:
def current_user=(user) cookies.permanent.signed[:remember_token] = [user.id, user.salt] @current_user = user end
奇怪的是,当指定当前用户的行为与暗示相同时,存在特定的“登录”方法。
但是,从一个风格问题来看,当一个用户正在查看另一个用户时,调用这些方法session_user
而不是current_user
可能更有意义。 “当前”可能表示“我正在查看的用户”或“我当前登录的用户”,具体取决于您的观点,这会导致混淆。 “会话”更具体。
更新:
在回复您的附录时,使用cookies
进行读取和cookies.permanent
分配的原因与使用flash.now
分配和flash
读取flash.now
相同。 .permanent
和.now
部分旨在用于执行赋值运算符。
- Michael Hartl的Rails 3教程:has_password问题? 第7章中的方法
- 无法启动WEBrick,Rails gem的文件夹为空
- Rails教程演示应用程序中的ExecJS :: ProgramError
- Rails找不到已安装的gem
- Hartl Ruby on Rails教程4 ch 10,用户编辑测试失败
- UsersController中的NoMethodError #show / undefined方法`key?’ 为零:NilClass
- 如何使用RSpecs valid_session?
- 无法运行rails服务器:`require’:无法加载此类文件–net / ssh(LoadError)
- Ruby on Rails Michael Hartl第8.5章测试失败