Rails 3 Devise Session有值但是<%if user_signed_in? %GT;是假的

时间:2012-02-15 08:04:50

标签: ruby-on-rails ruby-on-rails-3

我希望你能帮忙,现在已经在这个问题上苦苦挣扎了一段时间:| 我正在使用devise和Rails 3

当我点击登录时,我得到设计登录页面,我用户名和pw点击并点击登录。

点击登录后,我被重定向到主页面,但现在我仍然看到登录链接,这意味着<%if user_signed_in? %GT;仍然是假的。但是我登录后似乎会话变量中有一些值,这里发生了什么?我一直在使用设计并且之前没有任何问题。谢谢你们!

<小时/> 在我使用设计登录之前

<%= session %>
no value

<% if user_signed_in? %>
**is false**

用设计登录后

<%= session %>
_csrf_tokenAMUwVLu6G6rWfKICB43PYApFsYFRjVyJDSc2oU88uEk=warden.user.user.keyUser342$2a$10$.zslfggeUqvq.m/5LNSolOsession_id0db80c26bc36a4c1c74c223655dcb092

<% if user_signed_in? %>
**is false**

修改

我的routes.rb文件

Cybercellar3::Application.routes.draw do
  devise_for :users

  get "home/index"


<% if signed_in? %>
**is still false**

EDIT2:

user.rb

class User < ActiveRecord::Base
      # Include default devise modules. Others available are:
      # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable

      # Setup accessible (or protected) attributes for your model
      attr_accessible :email, :password, :password_confirmation, :remember_me
    end

我想我在我的一个控制器中发现了我的问题

application_controller.rb

    #facebook stuff
    def current_user
        @current_user ||= User.find_by_id(session[:user_id])
    end

    def signed_in?
        !!current_user
    end

    helper_method :current_user, :signed_in?

    def current_user=(user)
        @current_user = user
        session[:user_id] = user.id
    end
    #facebook stuff

删除此块后,它似乎完美无缺:)

4 个答案:

答案 0 :(得分:3)

Devise有一个“范围”概念,因此您可以同时登录多种类型的用户,例如管理员用户和普通用户。要检查任何范围的用户是否已登录,请使用signed_in?。范围由模型类和routes.rb文件的命名定义。确保它们匹配。你能发布两个吗?要对此进行测试,您还可以尝试集成测试。

答案 1 :(得分:0)

我也遇到过这个问题。这很有趣,因为user_signed_in?应该比current_user更可靠,但这似乎表明了我所怀疑的 - 它实际上不那么可靠。

如果有人发现不同的东西,请告诉我们。

答案 2 :(得分:0)

伙计们,我一直在努力解决同样的问题,最后找到了解决方案!可能不是你的情况,但仍然如此。

当我从简单的手写身份验证过程切换到Devise时,出现了问题。而current_user或user_signed_in的原因是什么?在登录时我都是空白和假的,我在我的sessions_helper.rb文件中有类似的命名方法(sign_in,current_user等),这些方法保留在旧系统中,而这些(旧的)方法是从一个全新的Devise控制器调用的来自Devise lib的正确版本。

所以我只是注释了我的旧会话助手中提供身份验证过程的所有方法。然后它奏效了!

答案 3 :(得分:0)

正如@Irina Nazarova所说。检查以确保您没有任何与您自己编写的项目名称相同的方法。似乎Devise首先使用它。这就是造成我的问题的原因。