Rails NumericValueOutOfRange отображает поле, связанное с ошибкой - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть 3 целочисленных поля, которые создают сумму при отправке.При отправке, если числовое поле переполнено для avg_price, возможно ли отобразить сообщение в разделе ошибки if sales.errors.any? с ошибкой, в которой указано «Средняя цена поля имеет переполнение числового поля» или что-то подобное.

В настоящее время я получаю следующую ошибку:

PG::NumericValueOutOfRange: ERROR: numeric field overflow DETAIL: A field with precision 3, scale 1 must round to an absolute value less than 10^2

Схема

create_table "sales", force: :cascade do |t|
    t.integer "price_1"
    t.integer "price_2"
    t.integer "price_3"
    t.decimal "avg_price", precision: 3, scale: 1
end

Модель

def sale_sum
  if (self.price_1 && self.price_2 && self.price_3).present?
    self.avg_price = ((self.price_1 + self.price_2 + self.price_3)/3.0)
  end
end

Форма

<%= form_with(model: sales, local: true) do |f| %>
  <% if sales.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(sales.errors.count, "error") %> prohibited this sale from being saved:</h2>
      <ul>
      <% sales.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <%= f.number_field :price_1 %>
  <%= f.number_field :price_2 %>
  <%= f.number_field :price_3 %>
  <%= f.submit 'Submit' %>
<% end %>

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

С ответом @mehedi я наткнулся на пользовательские сообщения, которые помогли мне решить мою проблему.В моей модели я создаю собственный метод, который, если сумма полей превышает 99,99, отображает сообщение об ошибке.

def error_message
  if ((self.price_1 + self.price_2 + self.price_3)/3.0) > 99.99
    errors.add(:avg_price, "can't be more then 99.99")
  end
end
0 голосов
/ 20 декабря 2018

Вы можете использовать свойство min или max для числового поля.Это очень полезно для нас.Например,

<%= f.number_field :price_1, min: 0, max: 2000 %>
0 голосов
/ 19 декабря 2018

Вы можете использовать числовой ValidationHelper of Rails.

validates :avg_price, numericality: {only_integer: true, greater_than: -100, less_than: 100}

Это покажет гораздо более удобочитаемое сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...