将用户输入转换为整数

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.