Jef*_*ros 1 ruby ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)
在我尝试创建第一个用户之后,我收到了以下错误:
NoMethodError in Devise::RegistrationsController#create
undefined method `current_sign_in_ip' for #<User:xxxxxxxxx>
Run Code Online (Sandbox Code Playgroud)
我不明白为什么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
Run Code Online (Sandbox Code Playgroud)
为什么current_sign_in_ip甚至被召唤?
导致错误是因为您没有数据表中的属性:current_sign_in_ip和:last_sign_in_ip属性.
这就是为什么:
# t.inet :current_sign_in_ip
# t.inet :last_sign_in_ip
Run Code Online (Sandbox Code Playgroud)
在原始迁移中注释掉它们会阻止它们被追加.你知道这个.
答案中提到的修复方法mentanco是将它们放回到表中,或者:trackable从Devise中删除引用...
以下是如何进行迁移以添加额外数据:
$ 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
Run Code Online (Sandbox Code Playgroud)
如果你运行它,它会将属性添加到表中并使功能再次运行,或者,您可以:trackable从Devise模型中删除它以允许它完全跳过该过程.