Ruby on rails 表单_中浮动的自定义格式

Ruby on rails 表单_中浮动的自定义格式,ruby-on-rails,Ruby On Rails,有没有办法控制表单字段中的浮点格式 如果模数为0,我想将浮点格式化为整数,否则按原样显示浮点。我重写了模型访问器以进行此格式化 加载编辑表单时,我希望进行以下转换: stored value | accessor returns | form field shows --------------------------------------------------- 1.0 | 1 | 1 1.5 | 1.5

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

如果模数为0,我想将浮点格式化为整数,否则按原样显示浮点。我重写了模型访问器以进行此格式化

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

stored value | accessor returns | form field shows
---------------------------------------------------
1.0          | 1                | 1
1.5          | 1.5              | 1.5
但是,form_for似乎直接访问属性,从而按原样显示浮点


有什么办法可以解决这个问题吗?谢谢。

我相信这样做会奏效:

<%= f.text_field :field_attribute, :value => format_method(f.object.field_attribute) %>
format\u方法(f.object.field\u属性)%>

format_method是以这种方式访问模型时,在模型中用于覆盖格式的任何方法。

您可以覆盖属性读取器,如下所示:

def myfloat
  if @myfloat == @myfloat.to_i
    @myfloat.to_i
  else
    @myfloat
  end
end
现在,返回的值已针对您的表单正确格式化,并且在您的应用程序中仍然可用。

的解决方案将在您使用获取“原始”值时起作用:


和往常一样,在比较浮点和整数时,您需要小心舍入。

您可以覆盖respond\u to?在模型中,在调用\u类型\u转换之前停止值\u

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


在的表单中,将不会像前面提到的那样工作。尝试了多次。IMHO这是一个更严重的钢轨设计问题。一般来说,您并没有从视图直接访问模型的权限

是的,我的模型里已经有类似的东西了。但我的问题是如何获得表单_以使用重写的属性读取器?它似乎使用了read_属性或其他什么。我不认为使用了read_属性。根据中的“覆盖默认访问器”,当需要特殊行为时,应该使用我描述的方法。在您的情况下似乎是这样。我希望这能起作用,但text_field helper方法直接获取值(即它不调用访问器)。我考虑过在早期这样做,因为它在视图层中保留了格式逻辑,但我认为最好是将格式放入模型中,这样我就不必在视图中复制它了……但我想这就是partials的用途。我想我会采用这个解决方案。谢谢
def my_float
  raw = read_attribute(:my_float)
  if raw == raw.to_i
    raw.to_i
  else
    raw
  end
end
def my_float
  raw = read_attribute(:my_float)
  if raw == raw.to_i
    raw.to_i
  else
    raw
  end
end