ruby-on-rails - Rails 验证方法比较两个字段?

标签 ruby-on-rails ruby ruby-on-rails-3

我的模型有两个字段,作为验证的一部分,我想将它们相互比较。我想确定 end_time 在 start_time 之后。我写了一个验证方法来比较它们,但我一定做错了什么,因为值总是零。有人可以帮忙吗?

class LogEntry < ActiveRecord::Base
  validates :start_time, :presence => { :message => "must be a valid date/time" }
  validates :end_time, :presence => {:message => "must be a valid date/time"}
  validate :start_must_be_before_end_time

  def start_must_be_before_end_time
    errors.add(:start_time, "must be before end time") unless
       start_time > end_time
  end 
end

得到错误

undefined method `>' for nil:NilClass

因此,start_time 和/或 end_time 为零。我以为我在关注我发现的许多例子,但显然不是。我错过了什么?

谢谢。

最佳答案

我最好的猜测是你需要你的方法看起来像这样:

private

def start_must_be_before_end_time
    errors.add(:start_time, "must be before end time") unless
        start_time < end_time
end 

(另外,注意 < 而不是 > (或更改为 if>= )

如果这不起作用,那么您还应该检查 start_timeend_time在 Controller 中被正确定义,因为如果跨多个表单元素创建时间,可能会发生有趣的事情。

使用 Rails 7 ComparisonValidator

Rails 7 添加了 ComparisonValidator这允许您使用便捷方法 validates_comparison_of 像这样:

class LogEntry < ActiveRecord::Base
  validates_comparison_of :start_time, less_than: :end_time
  # OR
  validates_comparison_of :end_time, greater_than: :start_time
end

在这里了解更多:https://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_comparison_of

关于ruby-on-rails - Rails 验证方法比较两个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6401374/

相关文章:

ruby-on-rails - 在 Rails 3 中突出显示当前页面的最佳方式? -- 有条件地将 css 类应用于链接

javascript - 类型错误 : Cannot read property 'id' of undefined (User is undefined)

ruby-on-rails - 关闭 Rails 系统测试中的屏幕截图

ruby-on-rails - 如何改进用 `' ` 引用所有数组元素并返回包含所有这些引用和逗号分隔元素的字符串的代码?

ruby - 上传/发布 stringIO 作为文件

c# - Ruby - 枚举文件

mysql - 无法在rails中创建新记录

ruby-on-rails - 如何在 Rails 中使用多态关联管理多个角色?

ruby-on-rails - Capistrano 失败 - 没有当前目录/ bundle : not found/rolling back

ruby-on-rails - 初始化后的工厂女孩