所以我有一个用户可以输入价格的表单。我正在尝试制作一个 before_validation 来规范化数据,如果用户输入它,则剪掉 $。
before_validation do
unless self.price.blank? then self.price= self.price.to_s.gsub(/\D/, '').to_i end
end
如果用户输入 $50 此代码给我 0。如果用户输入 50$ 此代码给我 50。我认为由于数据类型是整数,所以 Rails 在我的 before_validation 之前运行 .to_i 并在 $ 之后剪切所有内容。如果数据类型是字符串,同样的代码也能正常工作。
有人有解决方案可以让我保留整数数据类型吗?
最佳答案
一种方法是覆盖设置价格的模型机制,如下所示:
def price=(val)
write_attribute :price, val.to_s.gsub(/\D/, '').to_i
end
所以当您执行 @model.price = whatever
时,它将转到此方法而不是 rails 默认属性编写器。然后您可以转换数字并使用 write_attribute
进行实际写入(您必须这样做,因为标准 price=
现在就是这种方法!)。
我最喜欢这种方法,但作为引用,另一种方法是在您的 Controller 中,然后再将其分配给模型。参数以字符串形式出现,但模型将该字符串转换为数字,因此直接使用参数。像这样的东西(只要适应你的 Controller 代码):
def create
@model = Model.new(params[:model])
@model.price = params[:model][:price].gsub(/\D/, '').to_i
@model.save
end
对于任一解决方案,删除 before_validation
。
关于ruby-on-rails - 将用户输入转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9679882/