为什么我得到错误nil的未定义方法`name’:使用Ruby on Rails的NilClass?

我认为名称和电子邮件等方法在rails中是默认的吗?

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

     

我输入了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 =登录用户记住令牌?

在我的sessions_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并没有完成任何事情。

您应该了解rails框架和ruby语言的快速事项:

  • 任何帮助程序和视图都可以使用任何助手中定义的函数(因此没有理由通过不同的帮助程序复制和粘贴相同的函数);
  • 您可能正在使用身份validationgem,我猜它是Devise gem。 如果这是对的,那么除非你有理由这样做,否则你不应该压倒他们的助手;
  • User.anything将从User类调用静态函数;
  • 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哈希访问请求的参数。

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

(虽然有几种方法可以在Rails中实现和管理会话,但默认情况下在浏览器中使用cookie来引用存储在内存中的密钥。会话是由浏览器的请求创建的,所以尽管可以使用控制台来实现得到现有的会话,可能不是你想要的。)

所以你的方法user_from_remember_token要么返回一个用户,要么返回nil。 我在您的代码中没有看到的是您在User模型上设置 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包含或要求会话帮助application_controller.rb