繁体   English   中英

Rails教程:Cookie与记住令牌不匹配

[英]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_tokenencrypt方法,而且有create_remember_token私有方法? 还请确保您具有before_create过滤器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM