Rails验证变量proc

时间:2013-01-14 10:54:20

标签: ruby-on-rails ruby-on-rails-3 validation lambda proc

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

这是我的工作代码。我想要动态的是“15”部分,例如

  

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

我定义了以下类方法:

def self.max_passengers
   15
end  

当然没用。我尝试过使用Procs和lambdas,但它对我来说无法正常工作。 :( 有人可以帮助我这个 - 有可能吗?

3 个答案:

答案 0 :(得分:3)

您正在寻找custom validation method

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 } }

请注意,如果您在范围内使用:in,则不需要最小值/最大值。

答案 1 :(得分:0)

检查validates_with是否有任何帮助。该助手将记录传递给单独的类以进行验证,您可以通过阅读某些配置等使您的验证标准动态化。 有关validates_with的更多信息,请访问ruby on rails guide

class Person < ActiveRecord::Base
  validates_with GoodnessValidator
end

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

答案 2 :(得分:0)

试试这个:

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