ruby-on-rails - 将用户输入转换为整数

标签 ruby-on-rails ruby

所以我有一个用户可以输入价格的表单。我正在尝试制作一个 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/

相关文章:

ruby-on-rails - rails 迁移 : Bigint on PostgreSQL seems to be failing?

ruby-on-rails - Rails 4 中的多态发布

javascript - 如何从 JavaScript 'onclick window.open' 事件中抓取 URL?

ruby-on-rails - rails 4 : Error when installing tiny_tds gem?

ruby-on-rails - 为什么我的部署检查在这里失败

jquery - 如何使用 jquery 和 Rails 3 发送带有嵌套表单的动态参数?

ruby-on-rails - 有没有像 cacti 一样使用 Rails 的开源项目?

ruby-on-rails - http ://updatesite. ruby​​people.org/release 不是有效的存储库

ruby-on-rails - 如何从 Ubuntu 中删除 Ruby

css - Ruby on Rails - image_tag 找不到本地镜像