我的模型有两个字段,作为验证的一部分,我想将它们相互比较。我想确定 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_time
和 end_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
关于ruby-on-rails - Rails 验证方法比较两个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6401374/