在form_for中自定义float的格式

时间:2010-01-10 04:53:54

标签: ruby-on-rails

有没有办法控制表单字段中的浮点格式?

如果模数为0,我想格式化一个整数浮点数,否则按原样显示浮点数。我重写模型访问器来执行此格式化。

加载编辑表单时,我希望进行以下转换:

stored value | accessor returns | form field shows
---------------------------------------------------
1.0          | 1                | 1
1.5          | 1.5              | 1.5

但是,form_for似乎是直接访问属性,因此按原样显示浮动。

有关如何解决此问题的任何想法?感谢。

5 个答案:

答案 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)

如果您使用Veger获取“原始”值,则

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