[英]rails tutorial: cookie doesn't match remember token
我正在做迈克尔·哈特尔(Michael Hartl)的Rails教程第8章。当我尝试通过存储在浏览器cookie中的Remember_token查找用户时,它不起作用。 find_by方法返回NIL。 我一直在尝试通过查看存储在浏览器中的记住令牌cookie并将其与存储在用户数据库中的记住令牌cookie进行调试。 他们不匹配,我也不知道为什么。 这是会话助手的代码。
module SessionsHelper
def sign_in(user)
remember_token = User.new_remember_token
cookies.permanent[:remember_token] = remember_token
user.update_attribute(:remember_token, User.encrypt(remember_token))
self.current_user = user
end
def signed_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user
#remember_token = User.encrypt(cookies[:remember_token])
remember_token = "71e45660fbaa69bad9fb55b912f80122a584f6af"
#@current_user ||= User.find_by(remember_token: remember_token)
@current_user ||= User.find_by_remember_token(remember_token)
end
end
我一直在对其进行调整,以尝试找出正在发生的情况。 为了进行调试,我注释掉了常规行,并使用在数据库中看到的值明确设置了记住标记-然后该应用程序开始工作。 当我将浏览器中存储的cookie的值与数据库中存储的记住令牌的值进行比较时,它们不匹配。
我注意到的另一件事是我无法致电User_find_by。 我收到一条错误消息,指出它无法识别此方法,因此我将其注释掉。 但是,我可以致电User.find_by_remember_token。 我可能安装了错误的版本?
我尝试过重置数据库-但我可以看到它,并且看起来它具有所有正确的列。
这是_header.html.erb代码:
<header class="navbar navbar-fixed-top navbar-inverse">
<div class="navbar-inner">
<div class="container">
<%= link_to "sample app", root_path, id: "logo" %>
<nav>
<ul class="nav pull-right">
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Help", help_path %></li>
<% if signed_in? %>
<li><%= link_to "Users", '#' %></li>
<li id="fat-menu" class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Account <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><%= link_to "Profile", current_user %></li>
<li><%= link_to "Settings", '#' %></li>
<li class="divider"></li>
<li>
<%= link_to "Sign out", signout_path, method: "delete" %>
</li>
</ul>
</li>
<% else %>
<li><%= link_to "Sign in", signin_path %></li>
<% end %>
</ul>
</nav>
</div>
</div>
</header>
看来问题可能出在您的SessionsHelper中的第20行。 应该:
@current_user ||= User.find_by(remember_token: remember_token)
而不是将记住令牌传递到User.find_by()方法中,而是尝试调用方法find_by_remember_token,该方法不存在。
首先, User_find_by()
不是方法。 它是User.find()
或User.find_by_columnName()
,其中columnname
是您要搜索的数据库中的列。
另外,您必须确保正确定义了User
模型。 我假设你遵循直到这一点,所有的指令让你有new_remember_token
和encrypt
方法,而且有create_remember_token
私有方法? 还请确保您具有before_create过滤器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.