ric*_*rad 7 ruby ruby-on-rails
这是我在我的模型中使用的内容:
before_validation :strip_dollar_sign
validates :amount_due,
:format => { :with => /^\d+??(?:\.\d{0,2})?$/ },
:numericality => {:greater_than => 0}
private
def strip_dollar_sign
self.amount_due = self.amount_due.to_s.tr!('$,','').to_f
end
Run Code Online (Sandbox Code Playgroud)
如果我在Rails控制台中手动运行strip_dollar_sign函数中的行,我得到了我想要的(即400美元最终为400.0)但是当我在我的应用程序中使用实际表单时,值总是最终为0.0.有人抓到我做错了吗?
And*_*all 17
这里有三个问题:
正如Stefan在他的回答中指出的那样,你可能想要删除,你的tr!电话,虽然它不会影响你的替换$.
您正在使用tr!,并且以不正确的方式使用其返回值.tr!(如果没有Ruby的大多数!方法变体),nil如果没有对原始字符串进行任何更改,则返回.由于nil.to_fIS 0.0,这就是为什么你得到的是(或许不是,见下文).你应该改用tr.
Rails的自动赋值参数转换为正确的类型,与它相关的数据库列,所以即使之前验证你的价值被转换为float,并且"$400".to_f是0.0,这是你的回调所看到的.解决方案是覆盖amount_due=而不是使用回调:
def amount_due=(value)
value = value.to_s.tr('$', '').to_f
write_attribute(:amount_due, value)
end
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
2630 次 |
| 最近记录: |