Rob*_*ert 11 ruby ruby-on-rails
所以我有一个用户可以输入价格的表格.我正在尝试使用before_validation来规范化数据,如果用户放置了$,则剪切$.
before_validation do
unless self.price.blank? then self.price= self.price.to_s.gsub(/\D/, '').to_i end
end
Run Code Online (Sandbox Code Playgroud)
如果用户输入$ 50这段代码给了我0.如果用户输入50 $这个代码给了我50.我认为因为数据类型是整数,rails在我的before_validation之前运行.to_i并且在$之后剪切所有内容.如果数据类型是字符串,则相同的代码可以正常工作.
任何人都有一个解决方案,让我保持整数数据类型?
Ben*_*Lee 21
一种方法是覆盖设置价格的模型上的机制,如下所示:
def price=(val)
write_attribute :price, val.to_s.gsub(/\D/, '').to_i
end
Run Code Online (Sandbox Code Playgroud)
所以当你这样做时@model.price = whatever,它将转到这个方法,而不是rails默认属性writer.然后你可以转换数字和write_attribute用来做实际的写作(你必须这样做,因为标准price=现在是这个方法!).
我最喜欢这种方法,但作为参考,在将其分配给模型之前,另一种方法是在控制器中.该参数以字符串形式出现,但模型正在将该字符串转换为数字,因此请直接使用该参数.像这样的东西(只是适应你的控制器代码):
def create
@model = Model.new(params[:model])
@model.price = params[:model][:price].gsub(/\D/, '').to_i
@model.save
end
Run Code Online (Sandbox Code Playgroud)
对于任一解决方案,请删除它before_validation.
| 归档时间: |
|
| 查看次数: |
25460 次 |
| 最近记录: |