簡體   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