Ruby on rails 如何记录用户使用Desive和Ruby on Rails注册的IP地址?

Ruby on rails 如何记录用户使用Desive和Ruby on Rails注册的IP地址?,ruby-on-rails,devise,Ruby On Rails,Devise,我尝试了以下方法: 在user.rb中: before_create :record_sign_up_ip protected def record_sign_up_ip self.sign_up_ip = current_sign_in_ip end 不幸的是,尽管当前的\u-sign\u-in\u-ip中有我正确的本地ip127.0.0.1,注册\u-ip仍然为零。我如何轻松获得注册人的IP?通常我会把它放在create控制器中,但是使用designe,您的用户模型中没有用户的控制器

我尝试了以下方法:

user.rb
中:

before_create :record_sign_up_ip

protected
def record_sign_up_ip
  self.sign_up_ip = current_sign_in_ip
end
不幸的是,尽管
当前的\u-sign\u-in\u-ip
中有我正确的本地ip
127.0.0.1
注册\u-ip
仍然为
零。我如何轻松获得注册人的IP?通常我会把它放在
create
控制器中,但是使用designe,您的用户模型中没有
用户的控制器

def init
    self.sign_up_ip = current_sign_in_ip
end

覆盖Desive使用的控制器,如中所述

根据该帖子的修改,创建app/controllers/users/registrations\u controller.rb:

# app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController

  def create
    params['user']['sign_up_ip'] = request.env['REMOTE_ADDR']   
    super
  end

end 
您还需要使注册变得可访问(对于Rails 3):


您可以覆盖/补充Desive使用的控制器,正如我在这里尝试的那样,在用户创建期间似乎没有调用init。是否需要其他配置?我不希望
注册\u ip
可以批量分配。在保存
User
对象之前,有什么方法可以修改它吗?在这种情况下,我可能会复制您正在从Desive::RegistrationController处重写的整个创建方法,并对其进行修改,以手动添加IP地址,而无需使sign\u IP mass可分配。另一种方法是使用attr\u readonly——这样,创建记录时,可以分配字段,但不允许批量分配更改值。由于上面的代码在创建记录时设置了注册ip,因此无法对其进行更改。我认为这是一个更好的选择,并编辑了我的答案,将attr_accessible更改为attr_readonly。不必考虑attr_readonly--看起来attr_readonly与定义为attr_accessible的其他字段不配合使用--但是,这篇文章还展示了如何通过实现只在更新时运行的验证来防止对注册ip的更改。
# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "users/registrations"}
# app/models/user.rb
  attr_accessible :sign_up_ip