Rya*_*yan 19 validation ruby-on-rails
我有一个Trip模型,其中包含start_odometer和end_odometer值.在我的模型中,我想验证结束里程表是否比起始里程表大.结束里程表也可以是空白的,因为旅行可能尚未完成.
但是,我无法弄清楚如何将一个属性与另一个属性进行比较.
在trip.rb中:
与符号比较:
validates_numericality_of :end_odometer, :greater_than => :start_odometer, :allow_blank => true
Run Code Online (Sandbox Code Playgroud)
给我错误:
TripsController中的ArgumentError #index
:greater_than必须是一个数字
与变量比较:
validates_numericality_of :end_odometer, :greater_than => start_odometer, :allow_blank => true
Run Code Online (Sandbox Code Playgroud)
TripsController中的NameError #index
未定义的局部变量或方法`start_odometer'for#
hol*_*den 34
对于这种情况,您不一定需要自定义验证方法.事实上,当你可以用一条线做它有点矫枉过正.jn80842的建议很接近,但你必须将它包装在Proc或Lambda中才能工作.
validates_numericality_of :end_odometer, :greater_than => Proc.new { |r| r.start_odometer }, :allow_blank => true
Run Code Online (Sandbox Code Playgroud)
jmc*_*vin 18
您可能需要在模型中为此编写自定义验证方法...
validate :odometer_value_order
def odometer_value_order
if self.end_odometer && (self.start_odometer > self.end_odometer)
self.errors.add_to_base("End odometer value must be greater than start odometer value.")
end
end
Run Code Online (Sandbox Code Playgroud)
如果使用Proc,则可以针对模型属性进行验证.
在rails4中你会做这样的事情:
class Trip < ActiveRecord::Base
validates_numericality_of :start_odometer, less_than: ->(trip) { trip.end_odometer }
validates_numericality_of :end_odometer, greater_than: ->(trip) { trip.start_odometer }
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12418 次 |
| 最近记录: |