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

时间:2015-10-08 06:30:51

标签: ruby-on-rails ruby devise

我刚刚将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 #<User:xxxxxxxxx>

我不明白为什么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甚至被调用?

2 个答案:

答案 0 :(得分:5)

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

这就是为什么:

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

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

正如mentanco在答案中所提到的,修复的方法是将它们放回到表格中,或者从Devise中删除:trackable引用...

enter image description here

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

$ 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

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

答案 1 :(得分:3)

你不能使用它们但是如果你删除它们会抛出错误,因为设计会在每个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

所以你有两个选择:

  1. 带回来!

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