2012-01-17 2 views
0

でresetingパスワードは、私はユーザモデルを持っているとき、検証を無効にする:次のように工夫/ウォーデン

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 

私がnilニックネームを持つデータベースのユーザレコードの数を持っている - これらの個人は、別のシステムからインポートし、私は実際に彼らのニックネームを持っていません。これらのユーザーは、http://example.com/users/password/edit?reset_password_token=iAYeQRwWrt8geC8eEXR4のような紛失したパスワードのリンクを使用してパスワードを設定してから、ログインするとニックネームなどの個人情報を追加します。

問題は、パスワードを入力するよう促されます(確認のためもう一度入力してください)。提出すると、ニックネームがnilであるため検証が失敗します。

パスワードをリセットするときにニックネームの検証を無効にするにはどうすればよいですか?パスワードリセットフォームにニックネームのテキストフィールドを追加したくありません。

あなたのご意見をお寄せいただきありがとうございます!

答えて

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