在Devise / Warden中重置密码时禁用验证

时间:2012-01-17 19:45:26

标签: ruby-on-rails ruby ruby-on-rails-3 rubygems devise

我的用户模型如下:

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。

重置密码时如何禁用昵称验证?我不想在密码重置表单上添加昵称文本字段。

提前感谢您的想法!

1 个答案:

答案 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
相关问题