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