这是我的设置:
user.rb
acts_as_authentic do |c|
c.logged_in_timeout(1.minutes)
end
user_session.rb
def to_key
new_record? ? nil : [ self.send(self.class.primary_key) ]
end
self.logout_on_timeout = true
application_controller.rb
helper_method :current_user_session, :current_user
private
def current_user_session
logger.debug "ApplicationController::current_user_session"
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end
def current_user
logger.debug "ApplicationController::current_user"
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.user
end
def require_user
logger.debug "ApplicationController::require_user"
unless current_user
#store_location
flash[:warning] = "You must be logged in to access this page"
#redirect_to new_user_session_url
redirect_to root_url
return false
end
end
def require_no_user
logger.debug "ApplicationController::require_no_user"
if current_user
#store_location
flash[:warning] = "You must be logged out to access this page"
redirect_to account_url
return false
end
end
但是当我加载页面时,我会收到错误
undefined method `logged_out?' for #<User:0x00000103ee8348>
我尝试阅读Authlogic的官方GitHub页面,但我仍然不知道,我想念的是什么......有人能给我一个解决方法吗?
非常感谢提前!
答案 0 :(得分:3)
我遇到了完全相同的问题,归结为我的用户模型中没有所有必要的列。
我原来的用户模型(来自db/schema.rb
)非常简约:
create_table "users", :force => true do |t|
t.string "username"
t.string "name"
t.string "crypted_password"
t.string "password_salt"
t.string "persistence_token"
t.string "perm", :default => "employee"
end
但是,我将列t.datetime :last_requested_at
添加到我的模型中,以及可能需要或可能不需要的其他一些列。我的最终用户模型如下:
create_table "users", :force => true do |t|
t.string "username"
t.string "name"
t.string "crypted_password"
t.string "password_salt"
t.string "persistence_token"
t.string "perm", :default => "employee"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "login_count", :default => 0, :null => false
t.integer "failed_login_count", :default => 0, :null => false
t.datetime "last_request_at"
t.datetime "current_login_at"
t.datetime "last_login_at"
t.string "current_login_ip"
t.string "last_login_ip"
end
在其他列中添加后,我不再收到undefined method 'logged_out?'...
错误。
(参考/更多信息:http://www.michaelhamrah.com/blog/2009/05/authlogic-and-openid-on-rails/ - 在logged_out?
的页面中搜索,解释是关于帖子的3/4左右。)
答案 1 :(得分:2)
如果您想知道用户是否已注销,您可以执行以下操作:
if current_user_session
...
如果用户已登录(有会话),则此条件将返回true
;如果他们已注销(会话为false
),则此条件将返回nil
。
至于错误消息,undefined method 'logged_out?' for #<User:0x00000103ee8348>
表示您尚未定义名为logged_out?
的方法,因此它不知道您的意思。
Authlogic没有为logged_out?
模型定义User
方法,也没有你,所以没有什么可以调用的。原因是“登录”或“注销”的状态与User
模型没有任何关系,而是与给定用户是否具有活动状态有关的属性UserSession
记录。