2011-11-01 122 views
4

我正在寻找登录/会话创建后挂钩设计。我会如何去做这件事?导轨设计挂钩on_login

基本上我想设置一个用户的位置,每次他们登录,并做到这一点,我需要一个排序后登录挂钩。

回答

4

设计成功登录时更新user.current_sign_in_at时间戳的值。所以,您可以简单地将before_save筛选器添加到您的用户模型中。在该过滤器中,检查该字段的值是否已更改,如果有,请设置用户位置。

顺便说一句 - 我不确定你的意思是“位置” - 如果你的意思是IP地址,Devise已经为你储存了它。

+0

并不是关键,但我很担心混合“controller'型逻辑(该页面直接某人)的模型类。这似乎模糊了Model-View-Controller的清晰分离。 –

+0

不知道为什么我没有想到这个!我正在使用他们的知识产权来获得他们与Geocoder的aprox位置,然后在我们维护的城市数据库中查找最近的城市。这应该完美,非常感谢。 – Marc

+0

凯文 - “位置”他并不是指URL(最初并不清楚)。 – cailinanne

0

这是来自devise wiki的页面:How To: Redirect to a specific page on successful sign in

综上所述,建议是通过以下方法添加到应用控制器:

应用程序/控制器/ application_controller.rb

def after_sign_in_path_for(resource) 
    custom_location_for(resource) || welcome_path 
end 

在上面的代码,resource指对象(用户,帐户等),你已经实现了设计认证。 (在你的路线中拥有devise_for的对象)。

+0

就我而言,这实际上是造成注册过程的一个问题。在我的情况下,注册控制器 - >确认电子邮件 - >确认控制器,然后直接到sign_in_and_redirect,这似乎跳过after_sign_in_path_for ...可能是一个本地化问题,但值得在每种情况下测试;) – pdelanauze

8

设计建立在监狱长身上,所以你可以使用监狱的after_authentication挂钩。

把这个在一个初始化:

Warden::Manager.after_authentication do |user,auth,opts| 
    # do something with user 
end 

远程IP地址和其它请求信息被存储在auth.request(即auth.request.remote_ip)。

https://github.com/hassox/warden/wiki/callbacks