Railsの確認バリデーションが「確認と一致しません」というメッセージを親属性に添付する方法が気に入らない...
validates(:password, {confirmation: true})
2 つが一致しない場合、「パスワードが一致しません」というエラーが確認に渡されるべきであることが、UX の観点からより理にかなっています。
確認属性に検証を追加しても無視されるようです...
validates(:password_confirmation, {my_validation: true, length: {maximum: 3}})
**length
検証はテストのみを目的としています。このスクリーンショットの [パスワードの確認] フィールドにエラーがないことに注意してください。
カスタム検証を作成しましたbetter_validation
:
class BetterConfirmationValidator < ActiveModel::EachValidator
def validate_each(record, attr_name, value)
parent_attr = attr_name.to_s
parent_attr['_confirmation'] = ''
unless value == record.send(parent_attr)
record.errors.add(attr_name, :better_confirmation, options.merge(:value => value))
end
end
end
しかし、確認フィールドに別の名前を付けないと機能しません (つまり、最後に「s」を追加します... :password_confirmations
)。
foo_confirmation
Railsに引き継がないように指示し、属性に検証を適用させる方法はありますか?
ありがとう!
編集
モデルコード...
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation
attr_accessor :password, :password_confirmation
validates :name,
presence: true,
length: { maximum: 50 }
validates :email,
presence: true,
format: { with: /\A.+@[a-z\d\-.]+\z/i },
uniqueness: true
validates :password,
length: { minimum: 6, maximum: 255 },
presence: { on: :create }
validates :password_confirmation,
presence: true,
better_confirmation: true
.
.
.
end