我正在做Michael Hartl的Rails教程第8章。当我尝试通过存储在浏览器cookie中的remember_token找到用户时,它无法正常工作。 find_by方法返回NIL。我一直在尝试通过查看存储在浏览器上的记忆令牌cookie并将其与存储在用户数据库中的记忆令牌进行比较来进行调试。他们不匹配,我不知道为什么。以下是Session Helper的代码。
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>
答案 0 :(得分:1)
看起来问题可能是你的SessionsHelper中的第20行。应该是:
@current_user ||= User.find_by(remember_token: remember_token)
不是将记忆标记传递给User.find_by()方法,而是尝试调用不存在的方法find_by_remember_token。
答案 1 :(得分:-2)
首先,User_find_by()
不是一种方法。它是User.find()
或User.find_by_columnName()
,其中columnname
是您要搜索的数据库中的列。
另外,您必须确保正确定义了User
模型。我假设您按照所有说明进行操作,以便使用new_remember_token
和encrypt
方法,并且您拥有create_remember_token
私有方法?还要确保你有before_create过滤器。