我的用户模型如下:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable, :invitable,
:recoverable, :rememberable, :trackable, :validatable,
:token_authenticatable, :omniauthable
validates_presence_of :nickname, :unless => :skip_nickname_requirement
end
我在数据库中有许多用户记录,其中有一个零昵称 - 这些人是从另一个系统导入的,我实际上并没有他们的昵称。邀请这些用户通过丢失的密码链接设置密码,如http://example.com/users/password/edit?reset_password_token=iAYeQRwWrt8geC8eEXR4
,然后当他们登录时,添加他们的个人详细信息,如昵称等。
问题在于,当您转到该重置密码时,系统会提示您输入密码(并再次进行确认)。提交时,验证失败,因为昵称为nil。
重置密码时如何禁用昵称验证?我不想在密码重置表单上添加昵称文本字段。
提前感谢您的想法!
答案 0 :(得分:0)
我不知道简单的validates_presence_of :nickname, allow_blank: true
是否可以解决您的问题,因为您可能希望它只对那些导入的用户来说是空白的。因此,其他方式是使用自定义验证。
# app/models/user.rb
class NicknameValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
record.errors[attribute] << "validation failed" unless :skip_nickname_requirement?(value)
end
private
def skip_nickname_requirement?(values)
# imported_from_legacy_system? would need to be implemented
value.present? || self.imported_from_legacy_system?
end
end
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable, :invitable,
:recoverable, :rememberable, :trackable, :validatable,
:token_authenticatable, :omniauthable
validates :nickname, :nickname => true
end