我希望你能帮忙,现在已经在这个问题上苦苦挣扎了一段时间:| 我正在使用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
删除此块后,它似乎完美无缺:)
答案 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首先使用它。这就是造成我的问题的原因。