Ish*_*wal 3 ruby ruby-on-rails devise
我有一个与 devise gem 集成的用户表。该表具有某些字段,如 current_sign_in_ip、last_sign_in_ip、current_sign_in_at 等。Devise 在用户登录时修改这些字段。我希望将这些字段移动到另一个表并通过 devise 或其他方式填充它们。有什么方法可以实现这个目标吗?
这个答案有两种方法:
第一个(更简单,尽管不是那么漂亮)选项是将:trackable方法委托给第二个类(下面称为 UserDetail)。例如:
class UserDetail < ActiveRecord::Base
...
end
class User < ActiveRecord::Base
delegate :current_sign_in_ip, :last_sign_in_ip .... to: :user_detail
...
end
Run Code Online (Sandbox Code Playgroud)
一个更干净的选择是创建一个避免覆盖 Devise 的关注点。您必须将其扩展到您的User模型:
module Trackable
def update_tracked_fields!(request)
old_current, new_current = user_detail.current_sign_in_at, Time.now.utc
user_detail.last_sign_in_at = old_current || new_current
user_detail.current_sign_in_at = new_current
old_current, new_current = self.current_sign_in_ip, request.ip
user_detail.last_sign_in_ip = old_current || new_current
user_detail.current_sign_in_ip = new_current
user_detail.sign_in_count ||= 0
user_detail.sign_in_count += 1
user_detail.save(:validate => false)
end
end
Run Code Online (Sandbox Code Playgroud)
我通过此链接从罗德里戈·弗洛雷斯那里得到了第二个解决方案。他提醒我们像他们在这里一样把砖块record.update_tracked_fields!(warden.request)放在地上。Warden::Manager.after_set_user
| 归档时间: |
|
| 查看次数: |
757 次 |
| 最近记录: |