session [:user_id]初始化

时间:2013-06-18 10:48:42

标签: ruby-on-rails ruby session

我需要控制用户当前是否登录我的网站,但是我在初始化用于此控件的变量时遇到问题: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

它有效! 此外,如果用户不需要'索引页面(登录页面)'但我不明白为什么

3 个答案:

答案 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