Rails设计和用户IP地址

时间:2015-09-22 05:24:06

标签: ruby-on-rails ruby ruby-on-rails-4 devise

目前在Rails 4上使用Devise 3.5.2,并启用了Devise的可跟踪功能。

通过一系列微服务,我们在RequestStore中拥有客户端的IP地址。除了我们想要将IP地址保存到user.current_sign_in_ip属性之外,它的效果很好。

我试着这样做:

def update_tracked_fields!(*)
  self.current_sign_in_ip = '10.0.0.1'
  super
end

但是这并没有提供所需的行为,因为在登录时,last_sign_in_ip会获得固定的10.0.0.1地址。

覆盖Devise用于存储IP的IP地址的最佳方法是什么?

非常感谢

1 个答案:

答案 0 :(得分:1)

查看Devise updated_tracked_fields method的片段:

old_current, new_current = self.current_sign_in_ip, request.remote_ip
self.last_sign_in_ip     = old_current || new_current
self.current_sign_in_ip  = new_current

您可以看到current_sign_in_ip已从request.remote_ip重新分配。所以你的代码没有任何效果。

使其工作的一种方法是尝试此代码:

def update_tracked_fields!(request)
  update_tracked_fields(request)
  self.current_sign_in_ip = '10.0.0.1'
  save(validate: false)
end

甚至更好:

def update_tracked_fields(request)
  super
  self.current_sign_in_ip = '10.0.0.1'
end