我目前正在通过RoR教程(http://railstutorial.org/chapters/sign-in-sign-out#sec:signin_success是相关部分),这似乎是相当不错的,虽然我在尝试查看示例站点时遇到以下问题。未定义的本地变量或方法'current_user'
Extracted source (around line #10):
7: <li><%= link_to "Home", root_path %></li>
8: <li><%= link_to "About", about_path %></li>
9:
10: <% if signed_in? %>
11: <li><%= link_to "Profile", current_user %></li>
12: <li><%= link_to "Sign out", signout_path, :method => delete %></li>
13: <% else %>
正如你所看到的,这个问题从我的方法而产生“signed_in?”这是为了检查用户是否登录或不通过检查CURRENT_USER变量是否被设置(我已经包括从助手的代码的其余部分给一个背景下,道歉):
module SessionsHelper
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
current_user = user
end
def sign_out
cookies.delete[:remember_token]
current_user = nil
end
def current_user= (user)
@current_user ||= user_from_remember_token
end
def signed_in?
!current_user.nil?
end
private
def user_from_remember_token
User.authenticate_with_salt(*remember_token)
end
def remember_token
cookies.signed[:remember_token] || [nil, nil]
end
end
从我的理解,。尼尔?是一种检查对象是否已被定义的方法,因此未定义的对象不应该生成错误而是返回false?我搜索了教程中关于current_user的所有案例(在检查是否有其他人有这个问题,并且没有成功之前),我的代码看起来是正确的,所以我有点困惑,如果有人能够帮助我理解Ruby变量的方式应该被访问,为什么我的代码不工作,我会非常感激。
编辑:
我不知道这是否与范围的重要,因为我刚开始都Rails和Ruby的,但助手SessionsHelper正在使用我的用户控制器和视图(它包含在我的应用程序控制器)
或者我相信你可以做“@current_user || = user_from_remember_token || false”,如果你想更符合你当前的代码。 – JackCA 2010-11-13 14:47:14
虽然这肯定会阻止错误,但它会不断返回错误。我想这可能会导致我的签名方法出现问题,导致current_user永远无法定义,所以最好让我在睡个好觉之后再看看它。 – djlumley 2010-11-13 14:49:07