2012-03-21 45 views
2

我以为方法,如名称和电子邮件默认在rails?为什么我得到错误未定义的方法名称为nil:NilClass与Ruby on 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

快速事物的会议助手,你应该知道Rails框架和Ruby语言:

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

这么说,我想你只是想检索当前用户记住令牌,该令牌可实现如下:

user = current_user.try(:remember_token) 

编辑:的问题是有点乱,但我也认为以下代码将与您的控制器配合使用:

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

您必须通过params散列来访问请求的参数。

+0

感谢所有有用的信息。我不得不用cookies替换params:User.find_by_remember_token(params [:remember_token]),解决了错误谢谢。 – Laser 2012-03-22 01:45:45

1

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

(虽然有实施和管理中的Rails会议几种方式,则默认使用Cookie在浏览器中引用的关键存储在内存中,会话是通过浏览器的请求创建的,所以尽管使用控制台可以访问现有的会话,但它可能不是您想要的。)

因此,您的方法user_from_remember_token将返回一个用户或零。我在代码中看不到的地方是设置用户模型中的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

+0

噢,我有一个叫做user.rb的用户名为attr_accessible的模型:name,:email等。我是否还需要创建一个static_pages.rb模型? – Laser 2012-03-21 19:33:44

+0

哦,geez,完全是我的坏 - 我想我几乎没有阅读你的帖子......不知道我错过了它怎么样!我会编辑我的答案。对不起,关于。 – 2012-03-21 19:37:32

+0

哈哈k,谢谢。 – Laser 2012-03-21 19:40:58

相关问题