2014-01-22 56 views
2

我試過如下:如何記錄用戶使用Devise和Ruby on Rails註冊的IP地址?

user.rb

before_create :record_sign_up_ip 

protected 
def record_sign_up_ip 
    self.sign_up_ip = current_sign_in_ip 
end 

不幸的是,雖然current_sign_in_ip127.0.0.1我正確的本地IP,sign_up_ip仍然是nil。我怎樣才能輕鬆獲得某人註冊的IP?通常我會把它放在create控制器中,但對於Devise,User沒有控制器。

+0

您可以覆蓋/補充由設計所使用的控制器這裏要注意http://stackoverflow.com/questions/3546289/override- devise-registrations-controller – nachbar

回答

2

替代使用設計爲在Override devise registrations controller

正如從後修飾注意到控制器,創建應用程序/控制器/用戶/ registrations_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 

也從該帖子修改,使用該控制器:

# app/config/routes.rb 
devise_for :users, :controllers => {:registrations => "users/registrations"} 

你也需要做出sign_up_up訪問(爲Rails 3):

# app/models/user.rb 
    attr_accessible :sign_up_ip 
+0

我不希望'sign_up_ip'可以被分配。在保存之前修改'User'對象的任何方法? –

+0

在這種情況下,我可能會複製整個創建方法,您在https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb上從Devise :: RegistrationsController覆蓋並且修改它以手動添加IP地址,但不使sign_up_ip可分配。 – nachbar

+0

另一種選擇是使用attr_readonly - 這樣,創建記錄時可以分配字段,但不允許批量分配更改值。由於上面的代碼在創建記錄時設置了sign_up_ip,因此無法更改它。我認爲這是一個更好的選擇,並編輯了我的答案,將attr_accessible更改爲attr_readonly。 – nachbar

0

在您的用戶模型,

def init 
    self.sign_up_ip = current_sign_in_ip 
end 
+0

當我嘗試過,init在用戶創建過程中似乎沒有被調用。是否需要額外的配置? – nachbar

相關問題