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

Posted

技术标签:

【中文标题】Rails 3 - 验证虚拟属性导致异常【英文标题】:Rails 3 - Validating against virtual attribute results in Exception 【发布时间】:2014-08-07 06:05:29 【问题描述】:

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

问题似乎是 net_weight 是一个浮点数,而 currentBalance 属性以字符串形式返回,导致异常显示:

浮点数与字符串比较失败

这是在选择产品时填充 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 属性转换为浮点数?

【问题讨论】:

【参考方案1】:

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

number(type="number") 并且对于浮点数添加一个 step 属性(例如 step="0.01") 并更改

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

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

【讨论】:

感谢您的回复。在我更改 .js 并查看文件以使用数字输入后,这种方法得到了相同的结果。【参考方案2】:

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

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

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

【讨论】:

以上是关于Rails 3 - 验证虚拟属性导致异常的主要内容,如果未能解决你的问题,请参考以下文章

rails 3验证多个属性的唯一性

rails 3 的验证自定义消息

试图在种子方法中的 SaveChanges 中找出我的验证错误

Rails - 验证:如果一个条件为真

rails 3中的api身份验证

Rails 3:验证组合值