【问题标题】:Why am I getting error Undefined method `name' for nil:NilClass with Ruby on Rails?为什么我在使用 Ruby on Rails 时收到 nil:NilClass 的未定义方法“名称”错误?
【发布时间】:2012-04-06 08:57:25
【问题描述】:

我认为诸如 name 和 email 之类的方法在 rails 中是默认的?

在我的静态页面视图中,在 profile.html.erb 我有:

<% if logged_in? %>
<% provide(:title, @user.name) %>
<% else %>
<% provide(:title, 'Profile')%>
<% end %>

我放入了我的 static_page_controller

def profile
  @user = User.find_by_remember_token(:remember_token)
end

当我进入控制台时, User.find_by_remember_token("actualtoken").name 会返回适当的用户名,但 :remember_token 不会。如何使 :remember_token = 登录用户记住令牌?

在我的 session_helper 我有

def log_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    current_user = user
  end

  def logged_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
      @current_user ||= user_from_remember_token
  end

  def log_out
    current_user = nil
    cookies.delete(:remember_token)
  end


    private

    def user_from_remember_token
      remember_token = cookies[:remember_token]
      User.find_by_remember_token(remember_token) unless remember_token.nil?
    end
end

将它复制到我的 static_pages_helper 并没有完成任何事情。

【问题讨论】:

    标签: ruby-on-rails methods undefined null


    【解决方案1】:

    编辑:用一个希望不那么愚蠢的答案完全取代我的第一个答案:-)

    (虽然在 Rails 中实现和管理会话有多种方法,但默认使用浏览器中的 cookie 来引用存储在内存中的密钥。会话是由浏览器的请求创建的,因此当然可以使用控制台获取现有会话,这可能不是您想要的。)

    所以你的方法 user_from_remember_token 要么返回一个用户,要么返回 nil。我在您的代码中没有看到您在用户模型上设置 remember_token 的位置。我假设它在那里,但您可能希望有代码告诉用户在您找不到它们时登录。一个常见的模式是

    def current_user
      @current_user ||= user_from remember_token
      unless @current_user
        flash[:notice] = "Yo!  Log in first."
        redirect_to login_path and return
      end
    end
    

    从单独的控制器调用模型查找器没有问题。但是为什么要打电话给User.find_by_remember_token(:remember_token)——你还没有remember_token(对吧?)。您不想在会话助手中调用current_user 方法吗?

    如果该方法不可见,您可能希望在您的application_controller.rb 中包含或要求会话助手

    【讨论】:

    • 哦,我有一个名为 user.rb 的 User 类模型,带有 attr_accessible :name、:email 等。我还需要创建一个 static_pages.rb 模型吗?
    • 哦,天哪,完全是我的错——我想我几乎没能读懂你的帖子……不知道我到底是怎么错过的!我会编辑我的答案。对不起,
    • 哦 current_user in view 我认为你的意思是?我也可以使用 current_user.name,谢谢。
    【解决方案2】:

    您应该了解 Rails 框架和 ruby​​ 语言的快速注意事项:

    • 在您的任何助手中定义的函数将可供所有助手和视图使用(因此没有理由通过不同的助手复制和粘贴相同的函数);
    • 您可能正在使用身份验证 gem,我猜它是 Devise gem。如果这是正确的,那么除非您有理由这样做,否则您不应该覆盖他们的助手;
    • User.anything 将从 User 类调用静态函数 anything
    • user = User.find_by_anything(the_thing) 是 ActiveModel 提供的类静态助手,它将查询数据库以查找具有 *anything = the_thing* 的用户;此用户或 nil 将被返回;
    • user.an_attribute会调用一个函数,返回用户指定的属性(默认与该属性的列名相同);
    • user.try(:anything) 将尝试从用户那里调用函数并返回其值。如果 user 为 nil,则返回值也将为 nil。

    也就是说,我猜你只是想检索当前用户记住令牌,这可以通过以下方式完成:

    user = current_user.try(:remember_token)
    

    已编辑:问题有点混乱,但我也认为以下代码适用于您的控制器:

    def profile
      @user = User.find_by_remember_token(params[:remember_token])
    end
    

    您必须通过 params 哈希访问请求的参数。

    【讨论】:

    • 感谢所有有用的信息。我不得不用 cookie 替换参数:User.find_by_remember_token(params[:remember_token]),这解决了错误谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    相关资源
    最近更新 更多