1

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_confirmationRailsに引き継がないように指示し、属性に検証を適用させる方法はありますか?

ありがとう!

編集

モデルコード...

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
4

1 に答える 1

0

試してみてください:

validates :password,
  presence: true,
  length: { minimum: 6, maximum: 255 },
  confirmation: true

またはこれで:

validate :password_confirmation_match


def password_confirmation_match
  self.errors[:password_confirmation] << "does not match password" if self.password_confirmation.to_s != self.password
end
于 2012-10-29T13:11:04.903 に答える