Проверки Rails - сообщения cutom не применяются - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть модель Ride с полем price и проверкой точности.Я хочу отобразить свое собственное сообщение об ошибке, когда проверка не удалась, но она не работает.

Согласно Rails Gudes"опция: message позволяет вам указать сообщение, которое будет добавлено в коллекцию ошибок при сбое проверки. Когда эта опция не используется, Active Record будет использоватьсоответствующее сообщение об ошибке по умолчанию для каждого помощника проверки. Параметр: message принимает строку или Proc. "

Я делаю это точно так же, как в примере, и он не работает.

Направляющие Rails

validates :age, numericality: { message: "%{value} seems wrong" }

Мой пример

validates :price, numericality: { message: "Invalid price. Max 2 digits after period"}, format: { with: /\A\d{1,4}(.\d{0,2})?\z/ }

spec / models / ride_spec.rb

context 'with more than 2 digits after period' do
      let(:price) { 29.6786745 }

      it 'the price is invalid' do
        expect(subject.save).to be_falsy
        expect(subject).not_to be_persisted
        puts subject.errors.full_messages.last # "Price is invalid"
      end
    end

Что я делаю не так?

Обновление

Это то, что я узнал до сих пор.Я установил цену пустой в тесте, и теперь она показывает сообщение об ошибке, которое мне нужно.

context 'with more than 2 digits after period' do
      let(:price) { '' }

      it 'the price is invalid' do
        expect(subject.save).to be_falsy
        expect(subject).not_to be_persisted
        puts subject.errors.full_messages.last # "Price Invalid price. Max 2 digits after period"
      end
    end

Заключение: это работает для проверки «присутствия», а не для проверки численности, что очень запутаннопоскольку документы ясно говорят, что вы проверяете количество, а не присутствие.Я прав?Это ошибка или преднамеренная?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я понял это, есть две проверки: проверка формата и проверка численности. Я не добавил сообщение для проверки формата, поэтому при сбое я получаю стандартное сообщение

validates :price, format: { with: /\A\d{1,4}(.\d{0,2})?\z/, message: 'Invalid price. Max 2 digits after period'}, numericality: { message: 'is not a number' }
0 голосов
/ 18 ноября 2018

Я думаю, что если вы идете не так, вы ожидаете, что numericality примет опцию проверки format. Обращаясь к активным руководствам записи , опция format.

отсутствует.

Видя, что вы назвали это price, кажется, что вы хотите сохранить точность до 2 десятичных знаков, чтобы вы могли хранить долларовую стоимость чего-либо. Правильным типом для этого является десятичное число с scale: 2, или что-то, с чем я имел успех в прошлом, это сохранение price в виде целого числа price_in_cents.

context 'with more than 2 digits after period' do
  let(:price) { 123.333 }

  it 'rounds to 2 decimal places' do
    expect(subject.save).to eq true
    expect(subject.reload.price).to eq 123.34
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...