сообщение об ошибке в форме не отображается правильно рельсы - PullRequest
0 голосов
/ 30 сентября 2019

Я создаю приложение блога в rails.

Версия Ruby -> 2.5.1 Версия Rails -> 5.1.7

У меня есть модель пользователя, в которой я проверяю парольи это подтверждение должно совпадать.

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

validates :password,  confirmation: {case_sensitive: true , message: "Passwords don't match"}

Теперь, когда я отправляю форму с другим паролем и ее подтверждение, в верхней части отображается сообщение об ошибке:

2 errors found.
Password confirmation Passwords don't match
Password confirmation doesn't match Password

И чтоЯ ожидал:

1 error found.
Passwords don't match

Это код вида формы, если требуется:

#The errors partial is just iterating over the user object errors and displaying them.
<%= render 'shared/errors', obj: @user %>
<div class="form-group">
  <div class="control-label col-sm-2">
    <%= f.label :password %>
  </div>
  <div class="col-sm-8">
    <%= f.password_field :password, class: "form-control", placeholder: "Enter password" %>
  </div>
</div>
<div class="form-group">
  <div class="control-label col-sm-2">
    <%= f.label :password_confirmation, 'Confirm Password' %>
  </div>
  <div class="col-sm-8">
    <%= f.password_field :password_confirmation, class: "form-control", placeholder: "Enter password again" %>
  </div>
</div>

Обновленная модель пользователя:

class User < ActiveRecord::Base

  has_many :articles
  validates :username, presence: true, uniqueness: {case_sensitive: false},
    length: {minimum: 3, maximum: 25}

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :email, presence: true, length: { maximum: 105 },
    uniqueness: { case_sensitive: false },
    format: { with: VALID_EMAIL_REGEX }

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

  validate :password_check

  before_save { self.email = email.downcase }

  has_secure_password

  private
  def password_check
    # Check for nils and blanks
    errors.add(:base, "Passwords don't match") if password != password_confirmation
  end

end

error message screenshot

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Параметры конфигурации не нужны, так как sensitive_case: true является значением по умолчанию, и message, если возникает двойное сообщение об ошибке.

validates :password, confirmation: true даст вам

1 error found.
Password confirmation doesn't match Password

Если выдействительно нужно это пользовательское сообщение, вы должны написать свой собственный метод проверки и добавить ошибку в base:

# validates :password,  confirmation: {case_sensitive: true , message: "Passwords don't match"}
validate :password_check

private
def password_check
  # Check for nils and blanks
  errors.add(:base, "Passwords don't match") if password != password_confirmation
end
0 голосов
/ 30 сентября 2019

Я думаю, что сообщение об ошибке activerecord и пользовательское сообщение об ошибке, которое вы добавили, напечатаны одновременно. Когда вы удаляете пользовательское сообщение об ошибке из проверки, я думаю, что проблема решится.

Если вы хотите добавить пользовательское сообщение об ошибке, измените стандартное сообщение об ошибке activerecord следующим образом:

# config/locales/en.yml
en:
  activerecord:
    errors:
      models:
        user:
          attributes:
            password:
              confirmation: "don't match"

ОБНОВЛЕНИЕ

Если вышеуказанный метод не решает проблему, вы можете написать пользовательскую проверку:

Удалить validates :password, confirmation: ..

validate :confirm_password

private
def confirm_password
  return if password == password_confirmation
  errors.add(:password, "don't match")
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...