设计错误:未定义的方法`current_sign_in_ip’

我刚刚将Devise安装到我的Rails 4.0.10应用程序中。 我希望用户可以跟踪,但我认为我不需要:current_sign_in_ip:last_sign_in_ip ,所以我删除了这些属性。

我的迁移:

  ## Trackable t.integer :sign_in_count, default: 0, null: false t.datetime :current_sign_in_at t.datetime :last_sign_in_at t.string :initial_ip # t.inet :current_sign_in_ip # t.inet :last_sign_in_ip 

在我尝试创建第一个用户之后,我收到了以下错误:

 NoMethodError in Devise::RegistrationsController#create undefined method `current_sign_in_ip' for # 

我不明白为什么甚至调用current_sign_in_ip 。 这是“创建”操作,肯定不包括该方法:

 def create build_resource(sign_up_params) resource.save yield resource if block_given? if resource.persisted? if resource.active_for_authentication? set_flash_message :notice, :signed_up if is_flashing_format? sign_up(resource_name, resource) respond_with resource, location: after_sign_up_path_for(resource) else set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format? expire_data_after_sign_in! respond_with resource, location: after_inactive_sign_up_path_for(resource) end else clean_up_passwords resource set_minimum_password_length respond_with resource end end 

为什么甚至会调用current_sign_in_ip呢?

导致该错误的原因是您的数据表中没有:current_sign_in_ip:last_sign_in_ip属性。

这就是为什么:

  # t.inet :current_sign_in_ip # t.inet :last_sign_in_ip 

在原始迁移中注释掉它们会阻止它们被追加。 你知道这个。

如在mentanco的回答中所提到的,修复的方法是将它们放回到表中,或者从Devise中删除:trackable reference …

在此处输入图像描述

以下是如何进行迁移以添加额外数据:

 $ rails g migration AddTrackingToUsers #db/migrate/add_tracking_to_users_________.rb class AddTrackingToUsers def change add_column :users, :current_sign_in_ip, :string add_column :users, :last_sign_in_ip, :string end end $ rake db:migrate 

如果你运行它,它会将属性添加到表中并使function再次运行,或者,您可以从Devise模型中删除:trackable ,以允许它完全跳过该过程。

你不能只是不使用它们但是如果你删除它们会抛出错误,因为设计会在每个sign_in之后查找这些属性来更新它们:

  module Trackable def update_tracked_fields!(request) old_current, new_current = self.current_sign_in_at, Time.now self.last_sign_in_at = old_current || new_current self.current_sign_in_at = new_current 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 self.sign_in_count ||= 0 self.sign_in_count += 1 save(:validate => false) end end 

所以你有2个选择:

  1. 把它们带回来!

  2. remove:从模型中可跟踪,然后它将不会调用此模块。