ruby-on-rails - 用整数写一个 Rails 验证器

标签 ruby-on-rails ruby validation

我试图为 Rails 编写验证以确保在表单中输入的价格大于零。它有效……有点。问题是当我运行它时,val 变成了一个整数,所以它认为 .99 小于 .1。这是怎么回事,我应该如何修复代码?

class Product < ActiveRecord::Base
  protected
    def self.validates_greater_than_zero(*attr_names)
      validates_each(attr_names) do |record, attr, val|
        record.errors.add(attr, "should be at least 0.01 (current val = #{val.to_f})") if val.nil? || val < 0.01
      end
    end
  public
  validates_presence_of :title, :description, :image_url
  validates_numericality_of :price
  validates_greater_than_zero :price
end

最佳答案

如果将原始字符串值转换为整数,则会向下舍入。所以“0.99”四舍五入为 0,这显然小于 0.01。您应该与原始字符串进行比较,您可以从 <attr>_before_type_cast 中获得原始字符串方法。

像这样的东西应该可以工作:

validates_each(attr_names) do |record, attr, val|
  if record.send("#{attr}_before_type_cast").to_f < 0.01
    record.errors.add(attr, "error message here")
  end
end

关于ruby-on-rails - 用整数写一个 Rails 验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2474255/

相关文章:

c# - ASP.NET Web 表单自定义验证器未触发

ruby-on-rails - 将键/值对转换为哈希

javascript - 在something.js.haml中编写JS if条件

ruby-on-rails - 升级到 Rails 5 问题 - 现有应用程序

ios - CocoaPods 安装失败(无法解析依赖)

Java Jersey 验证

c++ - 如果字符串是证书,如何检查 openssl c++,如果是,如果该字符串是根证书

ruby-on-rails - 自记录 REST 接口(interface)

ruby-on-rails - 安装ssl证书的问题

ruby-on-rails - rails : Concat Two CollectionProxies with two different models