我正在尝试删除模型中字段中的逗号。我希望用户键入一个数字,即。10,000,该数字应存储在数据库中为10,000。我希望我可以做一些模型端的规范化来删除逗号。我不想依赖于视图或控制器来正确地格式化我的数据。
我试过:
before_validation :normalize
def normalize
self['thenumber'] = self['thenumber'].to_s.gsub(',','')
end
没有工作。
我正在尝试删除模型中字段中的逗号。我希望用户键入一个数字,即。10,000,该数字应存储在数据库中为10,000。我希望我可以做一些模型端的规范化来删除逗号。我不想依赖于视图或控制器来正确地格式化我的数据。
我试过:
before_validation :normalize
def normalize
self['thenumber'] = self['thenumber'].to_s.gsub(',','')
end
没有工作。
6条答案
按热度按时间omqzjyyz1#
http://github.com/mdeering/attribute_normalizer看起来是解决这个常见问题的一个很有前途的解决方案。以下是主页上的一些示例:
所以在你的情况下,你可以这样做:
falq053o2#
我觉得你做得很对。本测试通过:
我用了你的密码。
现在,我的模式设置为数字是一个字符串,而不是整数。
如果你想把它作为一个整数存储在数据库中,那么你肯定需要覆盖setter:
如果你用自己的方式,用一个整数列,它会被AR截断....
这是Ruby和整数的一个鲜为人知的事情...它通过截断任何不再是整数的东西来自动转换。
可以很酷的事情,如
但对你现在的行为来说就不那么酷了。
因此,要么将col改为字符串并使用过滤器,要么更改setter:)
祝你好运!
plicqrtu3#
这样做的问题是,在一段时间内,非规范化的东西将存在于对象中;如果你的代码在规范化之前就能处理属性,那么这将是一个问题。
你可以定义一个setter:
不幸的是,我认为很多Rails表单都是直接写属性的,这也是我不倾向于使用它的原因之一。
或者你可以在传递控制器之前规范化参数。
zkure5ic4#
ruby让你在a .我不知道,我以后再试试,但我想你应该用。
ql3eal8s5#
你应该从before_validation方法返回true,否则如果赋值给self ['thenumber']的表达式最终为nil或false,则根据Rails文档,数据将不会被保存:
如果一个before_* 回调返回false,所有后续的回调和相关的操作都将被取消。
表面上,您试图在这里规范化,然后用Rails验证检查规范化的结果,这将决定nil/false/blank是否正确。
j2cgzkjk6#
Rails 7.1引入了
ActiveRecord::Base::normalizes
它在验证之前调用
它是安全的,因为它不适用于
nil
(但可以选择)它同时适用于持久性和查找器方法
如果您也需要对
nil
值应用标准化,请使用apply_to_nil: true
选项(
"default@email.com"
电子邮件将在nil
情况下分配)如果有遗留的非规范化记录,可以使用
ActiveRecord::Base#normalize_attribute
规范化它