Rails NumericValueOutOfRange显示与错误关联的字段

时间:2018-12-18 21:54:34

标签: ruby-on-rails ruby-on-rails-5

我有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 :(得分:2)

您可以使用numericality Rails的ValidationHelper。

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

它将显示更多人类可读的错误消息。

答案 1 :(得分:0)

使用@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

答案 2 :(得分:0)

您可以在数字字段中使用min或max属性。这对我们非常有帮助。 例如,

   
<%= f.number_field :price_1, min: 0, max: 2000 %>