2013-06-18 86 views
0

我需要控制用户当前是否登录了我的网站,但我有一个问题来初始化我用于此控件的变量:session[:user_id]会话[:user_id]初始化

这是我使用的代码:我把这个方法,我想阻止对未登录用户的所有控制器,使用此代码

def authenticate_user 
    if session[:user_id].nil? 
     redirect_to(:controller => 'users', :action => 'index') 
     return false 
    else 
     # set current_user by the current user object 
     @current_user = User.find session[:user_id] 
     return true 
    end 
end 

before_filter :authenticate_user, :only => [:index,:show,:edit] 

在我看来,问题是session[:user_id]变量,当用户访问我的网站变量不会初始化为nil,因此控件无法正常工作。

我可以初始化索引页的控制器中的变量,但是这种方法是错误的。

例如,当我请求该页面,而不登录:

127.0.0.1:3000/menus

错误是:

undefined local variable or method `authenticate_user' for #<MenusController:0x007faa6e5a4c20> 

UPDATE :

现在的误差不但是当用户还没有登录 条件:

if session[:user_id].nil? 

没有被证实。

如果我宣布在用户控制器这种方法:

before_filter :initializes 



def initializes 
    session[:user_id]=nil; 
    end 

它的作品! 此外,如果用户不需要“索引页(登录页)”,但我不明白为什么

+0

你的,除非声明或许应该是,如果有的authenticate_user。目前的逻辑是“如果有一个用户ID,重定向到users/index。如果没有用户ID,找到一个用户使用不存在的ID” – Matt

+0

啊好的!我必须用'如果'替换'除非'。我是吧? –

回答

1

试试这个

在你application_controller.rb

def current_user 
renturn unless session[:user_id] 
@current_user ||= User.find(session[:user_id]) 
end 


def authenticate_user! 
    redirect_to(:controller => 'users', :action => 'index') unless current_user 
end 

和动作指数不应该强制登录,因为我们有重定向除非用户没有登录。

在你users_controller.rb

before_filter :authenticate_user!, :only => [:show,:edit] 
0

你定义authenticate_use但你在你的过滤器的呼叫

+0

好的!现在错误没有了,但是当用户还没有登录时 条件: if session [:user_id] .nil? 未验证。 –