Ruby on rails 设计错误:未定义的方法“当前符号输入ip';

Ruby on rails 设计错误:未定义的方法“当前符号输入ip';,ruby-on-rails,ruby,devise,Ruby On Rails,Ruby,Devise,我刚刚在Rails 4.0.10应用程序中安装了Desive。我希望被用户跟踪,但我决定不需要:当前登录\u ip和:最后登录\u 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.in

我刚刚在Rails 4.0.10应用程序中安装了Desive。我希望被用户跟踪,但我决定不需要
:当前登录\u ip
:最后登录\u 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>

为什么
当前\u sign\u in \u ip
甚至被调用?

您不能仅仅不使用它们,但如果删除它们,将抛出错误,因为designe会在每次登录后查找这些属性以更新它们:

 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
因此,您有两种选择:

  • 把他们带回来

  • 移除:可从模型中跟踪,则不会调用此模块


  • 导致此错误的原因是您没有在数据表中获得ip中的
    :current\u sign\u和ip
    中的
    :last\u sign\u属性

    这就是为什么:

     # t.inet     :current_sign_in_ip
     # t.inet     :last_sign_in_ip
    
    注释掉原始迁移中的内容会阻止附加这些内容。你知道的

    正如
    mentanco
    在回答中提到的,修复的方法是要么将它们放回表中,要么从designe中删除引用

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

    $ 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
    

    如果您运行此操作,它将向表中添加属性并使功能重新工作,或者,您可以从Desive模型中删除
    :trackable
    ,以允许它完全跳过该过程。

    您是否执行了
    rake db:migrate
    ?如果您使用的是
    trackable
    ,Devise期望这些字段存在并将尝试使用它们。我明白了。你打算怎么把他们带回来?我不能在迁移中取消注释这些行,然后运行
    rake db:migrate
    ,可以吗?用这些字段添加新的迁移,然后点击rake db:migrate,不要编辑您已经运行的迁移。这就是答案,我正在用一些更丰富的信息更新+从我这里得到1分!谢谢,希望有帮助
    $ 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