2013-07-17 18 views
1

我正在做Michael Hartl的Rails教程第8章。當我嘗試通過存儲在瀏覽器cookie中的remember_token找到用戶時,它不起作用。 find_by方法返回NIL。我一直試圖通過查看存儲在瀏覽器中的記憶標記cookie並將其與存儲在用戶數據庫中的記憶標記進行比較來進行調試。他們不匹配,我不知道爲什麼。這是Session Helper的代碼。rails教程: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> 
+0

你可以發佈你的'用戶'模型嗎? – vee

+0

我秒。 '用戶'模型將幫助很多 – sambaek

回答

-2

首先,User_find_by()不是方法。它是User.find()User.find_by_columnName()其中columnname是您要搜索的數據庫中的列。

此外,您必須確保您的User模型已正確定義。我假設你遵循所有說明,直到那一點,所以你有new_remember_tokenencrypt方法,你有私人方法create_remember_token?還要確保你有before_create過濾器。

+1

find_by(* args)是一個ActiveRecord方法:請參閱http://api.rubyonrails.org – pickwick

+0

哦很好。感謝那。 – sambaek

1

看起來問題可能是SessionsHelper中的第20行。應該是:

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

不是傳遞的令牌記入你試圖調用一個方法find_by_remember_token,不存在User.find_by()方法。