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

时间:2012-03-21 19:19:47

标签: ruby-on-rails methods undefined null

我认为名称和电子邮件等方法在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 =登录用户记住令牌?

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

2 个答案:

答案 0 :(得分:2)

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

  • 任何助手定义的功能都可供所有助手和视图使用(因此没有理由通过不同的助手复制和粘贴相同的功能);
  • 您可能正在使用身份验证gem,我猜它是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 hash访问请求的参数。

答案 1 :(得分: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

中包含或要求会话助手