1

我正在做 Michael Hartl 的 Rails 教程第 8 章。当我尝试通过存储在浏览器 cookie 中的 remember_token 查找用户时,它不起作用。find_by 方法返回 NIL。我一直在尝试通过查看存储在浏览器上的记忆令牌 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>
4

2 回答 2

1

看起来问题可能出在 SessionsHelper 中的第 20 行。应该:

@current_user ||= User.find_by(remember_token: remember_token)

您尝试调用不存在的方法 find_by_remember_token,而不是将记住令牌传递给 User.find_by() 方法。

于 2013-08-14T10:19:15.947 回答
-2

首先,User_find_by()不是一种方法。它是User.find()或您要搜索的数据库中的列User.find_by_columnName()columnname

此外,您必须确保您的User模型定义正确。我假设您已经按照所有说明进行操作,所以您拥有new_remember_tokenandencrypt方法并且您拥有create_remember_token私有方法?还要确保你有 before_create 过滤器。

于 2013-07-17T20:44:54.270 回答