Rails 3 - 验证虚拟属性会导致异常

时间:2014-08-07 06:05:30

标签: jquery ruby-on-rails validation number-formatting virtual-attribute

我的一个模型中有一个名为currentBalance的虚拟属性。我视图中的ajax调用会填充此属性。在模型中,我尝试验证net_weight是否小于或等于currentBalance,表示库存中产品的总净重。

问题似乎是net_weight是一个浮点数,而currentBalance属性作为字符串返回,导致一个异常,表示:

  

Float与String失败的比较

以下是在选择产品时填充currentBalance输入字段的jquery:

$( ".fields" ).each( function(){    
    <% @currentBals.each do |c| %>
        if( $(this).find("option:selected").text() == '<%= c.material %>' ) {   
            $(this).find("input:text[readonly]").val("<%= number_with_delimiter(c.currentBal) %>")  
        } else {
            if ($(this).find("option:selected").text() == 'Select Material'){
                $(this).find("input:text[readonly]").val("<%=  number_with_delimiter(0) %>")
            }
        }
    <% end %>    

});

以下是模型中的验证码:

validates :net_weight, presence: true, numericality: { greater_than: 0.0, less_than_or_equal_to: :currentBalance }

我认为number_with_delimiter格式化语句导致了问题。但我希望在视图中格式化值。

如何在验证运行之前更改验证或将currentBalance属性转换为浮点数?

2 个答案:

答案 0 :(得分:0)

当前余额的输入标记是文本类型。尝试将该标记更改为键入

数字(type="number")和浮动数字添加步骤属性(例如step="0.01")并更改

$(this).find("input:text[readonly]") 

$(this).find("input:number[readonly]")

答案 1 :(得分:0)

所以我找到了一个解决方案,虽然我认为它有点hacky。在我的控制器的创建操作中,我遍历每个详细记录并从currentBalance属性中解析出逗号,然后在其上调用.to_f。

@shipment.details.each do |d|
         d.currentBalance = d.currentBalance.delete(',').to_f
end

我更愿意将这种逻辑推入模型中,但经过多次尝试(并且为了时间),这种方法很有效。如果有人知道如何将逻辑推入细节模型并仍然确保它正确验证我会很乐意尝试。