我有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 %>
答案 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 %>