Rails ActiveAdmin Decimal字段验证、错误提示及默认值问题
问题解决方案
1. 添加expense字段的语义错误提示
前端的input_html: { min: 0.0 }仅做前端输入限制,不会触发ActiveAdmin的语义错误提示。要实现和number字段一致的错误提示效果,需要在Test模型中添加后端数值验证:
# app/models/test.rb class Test < ApplicationRecord # 为三个expense字段添加数值验证,允许空值但禁止负数 validates :expense_one, numericality: { greater_than_or_equal_to: 0, message: "最小值为0" }, allow_nil: true validates :expense_two, numericality: { greater_than_or_equal_to: 0, message: "最小值为0" }, allow_nil: true validates :expense_three, numericality: { greater_than_or_equal_to: 0, message: "最小值为0" }, allow_nil: true end
当用户输入负数提交时,后端验证失败,ActiveAdmin的f.semantic_errors会自动渲染对应错误提示。
2. 设置total_cost无输入时默认显示nil
当前代码中to_f会把空值/nil转为0.0,我们可以先判断三个expense字段是否全为空,再决定返回nil还是求和结果。修改表单中total_cost的input_html部分:
test.input :total_cost, input_html: { readonly: true, value: begin # 过滤掉nil的expense值 expenses = [test.object.expense_one, test.object.expense_two, test.object.expense_three].compact # 若所有expense都为空则返回nil,否则计算总和 expenses.all?(&:blank?) ? nil : expenses.sum(&:to_f) end }
注意:需确保Test模型的total_cost数据库字段设置为null: true,允许存储nil值,避免数据库自动将空值转为0.0。
内容的提问来源于stack exchange,提问作者IshAsh
相关产品推荐
相关产品推荐

