Rails验证变量过程


:inclusion => {:in => r = (1..15), :min => r.first, :max => r.last}

这是我的工作代码。我想让"15"变成动态的部分,例如

:包含=> {:=> r = (1 . . Vehicle.max_passengers): min => r.first,: max => r.last}

我定义了下面的类方法:
def self.max_passengers
   15
end  

当然没用。我试过使用Procs和lambdas,但它不适合我。:(有人能帮我解决这个问题吗?

您正在寻找自定义验证方法:

ActiveRecord::Base.class_eval do
  def self.validates_max_passenger(attr_name, r)
    validates attr_name, :inclusion => { :in => r, :min => r.first, :max => r.last } }
  end
end
# later in your class of choice:      
validates_max_passenger :passengers, 1..5

或者,您可以使用lambda

尝试以下操作
def self.max_passengers
   1..15
end  

validates :attrib, :inclusion => {:in => lambda { |obj| ClassName.max_passengers } }

注意,如果您在range上使用:in,则不需要min/max。

检查validates_with是否有帮助。这个助手将记录传递给一个单独的类进行验证,在这个类中,您可以通过读取一些配置或其他方式动态地设置验证标准。关于validates_with的更多信息可在ruby on rails指南

class Person < ActiveRecord::Base
  validates_with GoodnessValidator
end
class GoodnessValidator < ActiveModel::Validator
  def validate(record)
     # implement your dynamic criteria here                 
  end
end

试试这个:

inclusion: { in: proc { 1..Vehicle.max_passengers } }

最新更新