【问题标题】:Disabling validations when reseting passwords in Devise/Warden在 Devise/Warden 中重置密码时禁用验证
【发布时间】:2012-01-17 19:45:26
【问题描述】:

我有一个用户模型如下:

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。

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

提前感谢您的想法!

【问题讨论】:

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


    【解决方案1】:

    我不知道简单的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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-18
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多