2012-01-17 69 views
0

我有一個用戶模型如下:禁用驗證在設計/獄長正在重置密碼時

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,然後當他們登錄時,添加他們的個人詳細信息,如暱稱等。

問題是,當你去重置密碼時,重新提示輸入密碼(並再次進行確認)。提交時,驗證失敗,因爲暱稱爲零。

如何重置密碼時禁用暱稱驗證?我不想在密碼重置表單上添加暱稱textfield。

在此先感謝您的想法!

回答

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