我需要控制用户当前是否登录我的网站,但是我在初始化用于此控件的变量时遇到问题:session[: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>
更新
现在错误已不复存在但用户尚未登录时 条件:
if session[:user_id].nil?
未经过验证。
如果我在用户控制器中声明此方法:
before_filter :initializes
def initializes
session[:user_id]=nil;
end
它有效! 此外,如果用户不需要'索引页面(登录页面)'但我不明白为什么
答案 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]
答案 1 :(得分:0)
您定义了authenticate_use但过滤器调用中有authenticate_user
答案 2 :(得分:-1)
您应该使用Devise gem进行身份验证https://github.com/plataformatec/devise