有没有办法控制表单字段中的浮点格式?
如果模数为0,我想格式化一个整数浮点数,否则按原样显示浮点数。我重写模型访问器来执行此格式化。
加载编辑表单时,我希望进行以下转换:
stored value | accessor returns | form field shows
---------------------------------------------------
1.0 | 1 | 1
1.5 | 1.5 | 1.5
但是,form_for似乎是直接访问属性,因此按原样显示浮动。
有关如何解决此问题的任何想法?感谢。
答案 0 :(得分:2)
使用
def my_float
raw = read_attribute(:my_float)
if raw == raw.to_i
raw.to_i
else
raw
end
end
form_for
内的将无法正常工作。多次尝试。恕我直言,这是铁路更严重的设计问题之一。通常,您没有从视图中直接(宁静)访问模型。
答案 1 :(得分:1)
您可以覆盖属性读取器,如下所示:
def myfloat
if @myfloat == @myfloat.to_i
@myfloat.to_i
else
@myfloat
end
end
现在,返回的值已正确格式化为您的表单,并且仍可在您的应用程序中使用。
答案 2 :(得分:0)
我相信当你做这样的事情时它会起作用:
<%= f.text_field :field_attribute, :value => format_method(f.object.field_attribute) %>
format_method是您在模型中使用的任何方法,以便以这种方式访问格式时覆盖格式。
答案 3 :(得分:0)
read_attribute
的解决方案将有效:
def myfloat
raw = read_attribute(:myfloat)
if raw == raw.to_i
raw.to_i
else
raw
end
end
一如既往地将浮点数与整数进行比较时,您需要注意舍入。
答案 4 :(得分:0)
你可以覆盖respond_to吗?在模型中停止调用value_before_type_cast。
def respond_to?(*args)
if args.first.to_s == "my_float_before_type_cast"
false
else
super
end
end
然后你还需要:
def my_float
raw = read_attribute(:my_float)
if raw == raw.to_i
raw.to_i
else
raw
end
end