未定义的局部变量或方法'current_user'

djl*_*ley 12 variables ruby-on-rails

我目前正在阅读一个RoR教程(http://railstutorial.org/chapters/sign-in-sign-out#sec:signin_success是相关部分),这似乎相当不错,尽管我遇到过尝试查看示例站点时出现以下问题.

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 %>
Run Code Online (Sandbox Code Playgroud)

如您所见,问题源于我的方法"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
Run Code Online (Sandbox Code Playgroud)

根据我的理解,.nil?是一种检查对象是否已定义的方法,因此未定义的对象不应生成错误,而是返回false?我在教程中搜索了current_user的所有情况(在检查是否有其他人遇到此问题但收效甚微)之前我的代码似乎是正确的所以我有点困惑,如果有人能够帮助我理解Ruby变量的方式应该被访问以及为什么我的代码不起作用我会非常感激.

编辑:

我不确定它是否对范围很重要,因为我只是开始使用Rails和Ruby,但帮助者SessionsHelper正被我的用户控制器和视图使用(它包含在我的Applications控制器中)

Men*_*tat 7

我遇到了同样的问题,出于同样的原因.您忽略了"清单9.16"中的部分说明.

def current_user= (user)
  @current_user ||= user_from_remember_token
end
Run Code Online (Sandbox Code Playgroud)

您应该将此更改为以下内容.

def current_user
  @current_user ||= user_from_remember_token
end
Run Code Online (Sandbox Code Playgroud)

您还需要将*self.*current_user的所有实例更改为*@*current_user.

执行此操作后,错误将得到解决.